初识PHP

时间:2024-03-10 15:29:12

初识PHP

  虽然是做前端的,可是平时看书、做项目都会与后端PHP相关,但却不是很了解,并经常听PHP大神说:PHP是世界上最好的语言!因此,通过这篇博文学习、总结PHP,来认识认识这个“世界上最好的语言”。

  

  第一部分:PHP简介

  1.PHP的全称是Hypertext Preprocessor,即超文本预处理器,它是一种通用开源脚本语言。们知道JavaScript也是一种运行在浏览器上脚本语言来控制页面内容,而PHP是运行在服务器端的脚本语言读取数据库把内容显示在页面上。另外,PHP是开源的,免费使用的,因此有着无数的民间高手,贡献这很多使用的类库,使其有强大的生命力,相对于微软公司的ASP.NET这种收费的情况而言还是有些些优势的,并且PHP可以运行在各种平台上,但是ASP.NET只能运行在windows平台下。当然ASP.NET也有很多优秀的地方是PHP不可及的。

  2.那么什么是PHP文件呢?我们有时可以看到以.php作为后缀名的文件,实际上这就是PHP文件,该文件可以包含文本、HTML、JavaScript代码和PHP代码,且PHP代码在服务器上执行,结果以纯HTML形式返回给浏览器。

  3.PHP能做什么呢? 

  • 可以生成动态的页面内容(这个在前端通过ajax实现)
  • 可以创建、打开、读取、写入、关闭服务器上的文件
  • 可以收集表单数据(我们在前端写的表单 其中包括name value,这些都是和PHP相关的)
  • 可以添加、删除、修改我们的数据库中的数据

  当然,除此之外,PHP还有很多强大的功能。通过PHP,我们不再限于输出HTML,还可以输出图像、PDF文件、flash电影等。

  4.为什么使用PHP? 前面介绍过,它可以在不同的平台上运行(windows、linux、unix、MAC os x等),并且它与目前几乎所有的正在被使用的服务器兼容(Apache、IIS等)。

  

  第二部分:PHP语法

 一. 基本的PHP语法如下:

  PHP脚本可以放在文档中的任何位置,PHP脚本以<?php开始,以?>结束,如下代码:

<?php
    //PHP代码
?>

   php文件的默认文件扩展名为.php,这个文件中通常包含了HTML标签和一些PHP脚本代码,比如下面的PHP文件实例:

<!DOCTYPE html>
<html>
<body>
<h1> 我的第一个PHP文件</h1>
<?php 
echo "Hello World!"; 
?> 
</body>
</html>

  运行结果如下:

    对于上面的PHP文件,有以下几点需要注意:

  • 我在文件中没有加入<meta>标签,实际上也是可以加的,只是我省略了而已
  • 我们注意到PHP中的每个代码行都必须以分号结束,分号是一种分隔符,用于把指令集区分开来。
  • echo指令用于输出,另外还有print指令。注意发音:

 

  

      另外,我在PHP代码里使用了注释。//为单行注释,和JavaScript是相同的。多行注释可以使用/* */。

  

  

 

二.PHP中的变量

   1.基本概念

   和其他所有语言都一样,变量即存储信息的“容器”。与代数类似,可以给PHP变量赋予某个值(比如 x=10)或者表达式(z=x+y)。 毫无疑问的,变量可以是很短的名称(如x和y这种只有一个字母)或者是更具描述性的名称(如age、carname、totalvolume)。规则如下;

  • 变量必须以$符号开始,后面跟着变量的名称。
  • 变量名必须以字母或者下划线字符开始(注意:在JavaScript中变量必须以字母、下划线或$开始,这里类似的,知识必须用$说明是一个变量)
  • 变量名只能包含字母、数字以及下划线(A-z、0-9和_),这个和JavaScript是相同的。
  • 变量名中不能包含空格。
  • 变量名是区分大小写的。(注意:PHP语句和PHP变量都是区分大小写的

  

   2.创建(声明PHP变量)

     实际上,PHP没有变量声明的命令。变量在我们第一次赋值给它的时候被创建。如下所示:

<?php
$txt="hello world";
$x=5;
$y=10;
$z=$x+$y;
?>

  通过上面的php代码,实际上我们就创建了$txt变量、$x变量、$y变量、$z变量。

通过上面的例子我们可以看出:

  • 把一个文本值(即字符串)赋值给一个变量时,必须在文本值两侧加上双引号。
  • 可以看出,我们声明变量时没有指定该变量的数据类型,故PHP和JavaScript一样都是弱类型语言。而强类型语言如Java、C++是需要在使用变量前先声明(定义)变量的类型(如int double float string等等)和名称的。于是,PHP会根据变量的值自动把变量转化为正确的数据类型。

    

   3.变量作用域

    和其他所有语言一样,变量的作用域是脚本中变量可以被引用/使用的部分。

    PHP中有四种不同的变量作用域。分别是 local 、global、static、parameter。

    (1)首先讨论全局变量和局部变量。

        全局变量与全局作用域:在所有函数外部定义的变量,拥有全局作用域。除了函数外,全局变量可以被脚本中的任何部分访问,若要在一个函数中访问全局变量,需要使用global关键字。(关键:这里的全局变量竟然不能被函数访问!!!!

      局部变量:在PHP函数内部声明的变量时局部变量,仅能在函数内部访问(这一点与JavaScript相同)。 

      举例如下:

  

<?php 
$x=5; // 全局变量 

function myTest() 
{ 
    $y=10; // 局部变量 
    echo "<p>测试函数内变量:<p>"; 
    echo "变量 x 为: $x"; 
    echo "<br>"; 
    echo "变量 y 为: $y"; 
}  

myTest(); 

echo "<p>测试函数外变量:<p>"; 
echo "变量 x 为: $x"; 
echo "<br>"; 
echo "变量 y 为: $y"; 
?> 

  结果如下:

  

  几点讨论:

  • 调用myTest()函数时,只输出了y,因为y是函数内的局部变量,而没有输出x!(即前面所提到的,函数不能直接访问全局变量
  • 在外部直接输出x和y时,只输出了x,因为x时全局变量,而没有输出y,因为y时局部变量。
  • 我们可以看到代码 echo "变量 x 为: $x"; 在PHP中可以将变量放进字符串中输出(而在JavaScript中必须将变量和字符串使用+来拼接)。 

  (2).global关键字

  刚刚我们认识了PHP变量中这个奇怪的特点:即函数不能访问全局变量!

  但是我们可以通过global关键字使得函数可以访问全局变量。如下例所示:

  

<?php
$x=5;
$y=10;
function myTest()
{
   global $x,$y;
   $y=$x+$y;
  }
myTest();
echo $y;
?>

    之前说函数不能访问全局变量,但是只要我们把想要访问的全局变量在函数内加上global关键字就可以正常访问了。

  实际上,PHP将所有的全局变量存储在一个名为$GLOBALS[index]的数组中。index保存变量的名称。这个数组可以在函数内部访问,也可以用来跟新全局变量。上面代码改写为:

<?php
$x=5;
$y=10;

function myTest()
{
$GLOBALS[\'y\']=$GLOBALS[\'x\']+$GLOBALS[\'y\'];
} 

myTest();
echo $y;
?>

 

  (3)static作用域

  我们知道,当一个函数被调用之后,其内部的局部变量就会被销毁以释放内存,如果我们不想其被销毁,可以在声明变量时使用static关键字。如下:

<?php
function myTesy()
{
 static $x=0;
   echo $x;
    $x++;
}
myTest();
myTest();
myTest();
?>

  如果我们不使用static关键字,显然函数被调用之后,所有局部变量被销毁,结果就只会输出三个0。然而这里使用了static关键字,于是每次调用函数时,该变量就会保留函数前一次被调用的值。于是会输出012三个数字。注意:static $x=0;的作用仅仅是说明x是一个static变量并赋初值,而不会每次在调用函数时都把x变成0.

  

 

   4.echo和print语句

    作为前端工程师,实际上我们也总是会看到echo语句,并且还会有print语句。两者的具体作用是什么?又有什么区别呢?

  • echo可以输出一个或多个字符串或变量(变量可以直接放在字符串中,如果单独输出字符变量,不需要引号),且echo输出的速度比print快。echo是一个语言结构,使用的时候可以不加括号,也可以加上括号:echo 后echo()。比如:
    <?php
    $test="PHP";
    echo $test; echo("<h2> PHP is fun!</h2>"); echo "Hello world !<br>"; echo "I am interested in $test<br>"; echo "My","name","is","zzw"; ?>

      前面三句为使用echo输出一个字符串,而最后一句为使用echo输出多个字符串0。另外注意到使用echo输出的字符串中可以有HTML标签。

  • print同样也是一个语言结构,可以试用括号,也可以不使用括号:print或print()。但是print只允许输出一个字符串或者一个变量,其输出速度较echo慢,且echo没有返回值,而print的返回值为1。举例如下:
    <?php
       $test ="php";
        print $test;
        print "i love $test";
    ?>
    

     

    

   5.PHP中的数据类型

   PHP的数据类型有Sting、Integer、Float、Boolean、Array、Object、NULL,下面逐一介绍。

  • string(字符串)--字符串即为一串字符的序列,如“Hello world”。我们可以将字符串放在单引号或者是双引号中(这一点和JavaScript是一样的)。
  • Integer(整型)--即没有小数的数字,可以是整数也可以是负数。注意:在PHP中var_dump()函数返回变量的数据类型和值,PHP中竟然用到了和JavaScript中的var,尽管作用不一样...举例如下:
    <?php
        $x=628;
        var_dump($x);
        echo("<br>");
        $x=-345;
        var_dump($x);
        echo("<br>");
    ?>
    

    输出结果为:

    int(628)
    int(-345)
    

      

  • Float(浮点)--浮点数即带有小数部分的数字,或者是指数形式。如:
    <?php
        $x=6.28;
        var_dump($x);
    ?>
    

    会输出:float(6.28)。

  • Boolean(布尔型)--布尔型可以是true或者是false。如$x=true;或者$y=false;布尔型通常用于条件判断。
  • Array(数组)--数组可以在一个变量中存储多个值。例子如下:
    <?php
        $cars=array("Volvo","BMW","Toyota");
        var_dump($cars);
    ?>
    

    我们注意到:这是这个数组变量需要使用array()才能生效。结果会返回:array(3){[0]=>string(5) "Volvo" [1]=>string(3) "BMW" [2]=>string(6) "Toyota"}。结果中array(3)表示数组的长度为3, 【0】【1】【2】表示第一项、第二项、第三项。 string()表示每一项的长度。

  • Object(对象)--在PHP中,对象必须声明,即首先使用class关键字声明类对象。类可以是包含属性和方法的结构。即现在类中定义数据类型,之后会在实例化的类中使用数据类型。

   举例如下:

<?php
class Car
{
   var $color;
   function Car($color="green"){
        $this->color=$color;
   }
    function what_color(){
        return $this->color;
    }
}
?>

  其中和js类似,关键字this就是指向当前对象实例的指针,不指向任何其他对象或类。

 

     NULL(空值)--表示 没有值,我们也可以通过设置变量值为NULL来清空变量数据。

 

 

  6.PHP中的常量

  常量一经定义,在脚本的其他任何地方都不能被改变,且常量可以在整个脚本中使用(全局变量)。

      其定义举例如下:

define("GREET","hello world",false);

  其中第一个参数是必选的,规定了常量名称。第二个参数时必选的,规定了常量的值。第三个参数时可选的,若为true,则常量的大小写不敏感,false为大小写敏感。若省略不屑,默认是敏感的。如:

<?php
define("GREET", "hello world",false);
echo GREETING;    // 输出 "hello world"
echo \'<br>\';
echo greet;   // 输出 "greet",因为前面设置了大小写敏感。
?>

  

    7.PHP中的字符串变量

  (1)在PHP中,针对于字符串定义的运算符只有一个--并置运算符(.)。作用是把两个字符串的值连起来。如下所示:

<?php 
    $text1="zzw";
    $text2="you are handsome";
    $text=$text1." ".$text2;
    echo $text;
?>

  上述代码,通过并置运算符.将text1和有一个空格的字符串""和text2链接起来了。输出结果为: "zzw you are handsome"。

       (2)strlen()函数接受一个字符串作为参数,可以返回一个字符串的长度。如echo strlen("zzw");则输出结果为3。

        (3)strpos()函数接收两个参数,第一个是一个字符串,第二个是希望查找在第一个中的位置的字符串。如:echo strpos("zzw","w");此代码返回的是2。因为字符串中第一个字符的位置是0而不是1。

 

    8.PHP中的运算符

  • 算数运算符:+(加)  —(减)  *(乘)  /(除)  %(模)  -(取反,例:-2) .(并置)
  • 赋值运算符:=(将右边的值赋给左边) +=(与Js同)  —=  *=  /=  %=  .=   
  • 递增/递减运算符: ++ —— (这个和JavaScript以及C++中的用法相同)。
  • 比较运算符:==(等于) ===(恒等于) !=(不等于)  <>(不等于,这个符号之前没见多..) !== (不等于) >(大于) <(小于)  >=(大于等于)  <=(小于等于)
  • 三元运算符: (expr1)?(expr2):(expr3)  即对expr1求值为true是,值为expr2,否则值为expr3。
  • 数组运算符:+(集合) ==(相等)  !=(不相等) <>(不相等)  !==(不恒等)
  • 逻辑运算符
    • and  (与)   例如 (6<10 and 12>10)则返回true
    • or (或) 例如(6==5 or 6==6) 则返回true
    • xor(有且仅有一个为true) 如(6==6 xor  3==3 )则返回false
    • &&(与)和and用法同
    • ||(或)   至少有一个为true则返回true  例如(3==2 || 5==5)则返回true
    • !(非)  如!(3==5)返回true

   

        9.if else语句和swith语句和JavaScript完全相同,这里不再累赘。

 

   10.PHP中的数组。

      之前其实我们已经使用了,这里再接受一下。即:array()。再PHP中主要有三种类型的数组:

  • 数值数组--即带有数字ID的数组
  • 关联数组--带有指定的键的数组
  • 多维数组--包含一个或多个数组的数组

  首先谈谈数值数组,一般有有两种方法来创建数值数组

  法一: 自动分配ID键(注意:ID键总是从0开始

$cars=array("Volvo","BMW","Toyota");

  

  法二:人工分配ID键,如下所示:

$cars[0]="Volvo";
$cars[1]="BMW";
$cars[2]="Toyota";

  另外,PHP提供了一个统计数组长度的函数,count();以数组错位参数即可,如:统计cars数组的长度:

echo count($cars);

  输出结果为3。

 

  其次说明关联数组。同样有两种创建关联数组的方法。(注意:关联数组即ID键名为字符串而不是数字了)

  法一:

$age=array("zzw"=>"20","htt"=>"18");

  法二:

$age["zzw"]="20";
$age["htt"]="18";

  我们可以看出,法二可能更符合我们使用的习惯。

 

  关联数组不谈了,作为前端工程师,对此不细究~

  

  11.PHP数组的排序

  • sort()--对数值数组进行升序排序
  • rsort()--对数值数组进行降序排序  (注意:r在英语中是“反”的意思
  • asort()--根据关联数组的值,对数组进行升序排列
  • arsort()--根据关联数组的值,对数组进行降序排列
  • ksort()--根据关联数组的键,对数组进行升序排列(注意:key为键的意思)
  • krsort()--根据关联数组的键,对数组进行降序排列

 

  12.超级全局变量

  在PHP中,我们之前介绍过说一个函数不能直接访问全局变量,必须在函数内部使用global来声明这个变量,才能被函数调用,实际上,还有其他一些诸如此类的变量,为区分全局变量,我们称之为超级全局变量。如$GLOBALS $_SERVER $_REQUEST $_POST $_GET $_FILES $_ENV $_COOKIE $_SESSION。

  之前介绍过了global,因此下面着重介绍$_SERVER  $_REQUEST   $_POST  $_GET

  1.$_SERVER

    从名字可以知道server为服务器,且$_SERVER是一个包含了诸如头信息(header)、路径(path)以及脚本位置(script locationis)等信息的关联数组。即 $_SERVER是一个由Web服务器创建的包含头信息、路径等等的关联数组

  下面列出这个关联数组中的重要元素:

  • $_SERVER[\'PHP_SELF\']  即当前执行脚本的文件名。如http://example.com/test.php/foo.bar 的脚本中可得到/test.php/foo.bar
  • $_SERVER[\'SERVER_ADDR\'] 即得到运行PHP脚本所在的服务器的IP地址。
  • $_SERVER[\'SERVER_NAME\'] 即得到运行PHP脚本所在服务其的主机名
  • $_SERVER[\'SERVER_SOFTWARE\']  即的到服务其标识字符串,如Apache/2.2.24
  • $_SERVER["SERVER_PROTOCOL"] 即得到通信协议的名称版本,如HTTP/1.0
  • $_SERVER[\'REQUEST_METHOD\']  即得到访问页面使用的请求方法,如"GET"等
  • $_SERVER[\'HTTP_REFERER\'] 即引导用户代理到当前页的前一页的地址
  • $_SERVER[\'REMOTE_ADDR\']  即得到浏览当前页面的用户IP地址(remote即远程)
  • $_SERVER[\'REMOTE_PORT\'] 即得到用户机器上链接到服务其所使用的端口号
  • $_SERVER[\'SCRIPT_URI\'] 即URI来指定要访问的页面。例如"/index.html"

    更多点击这里

  

  2.$_REQUEST

  这个超级全局变量 用于通过接收如input的name值来接收HTML表单提交的数据(即value)。举例如下:

   如在一个HTML中的input(比如将其所在表单发送到example.php中)如下:

<input type="text" name="sex" value="man">

  这里我们默认value是man,实际上value应当由用户输入,这里我做了简化,而example.php中的代码如下:

<?php
    $user_sex=$_REQUEST["sex"];
    echo $user_sex;
?>

  即在php代码中,我们先使用$_REQUEST这个超级全局变量获得name=sex的值(即man)存到$user_sex这个变量中,然后输出。

  

  3.$_POST

  和$_REQUEST十分类似,只是$_POST的使用情况是在表单声明了method="post"的情况下,同过$POST来用$_REQUEST相同的方法来收集数据,这里不再举例。

  

  4.$_GET

  同样的,此方法类似上面两种方法,需要在form标签中指定该属性method="get",当然,根据get的特点,get也可以收集URL中发送的数据。对于form,方法和上面的request类似,不再举例。对于url的数据,举例如下,假定我们有一个包含参数的超链接的HTML页面如下:

<html>
<body>
<a href="test.php?subject=PHP&web=baidu.com">$_GET测试</a>
</body>
</html>

  于是,当我们点击了之后,就会向php文件发送这个参数,在PHP文件中我们可以这样接收:

<?php
    echo "project".$_GET("subject")."at".$_GET("web");
?>

  于是,我们就可以得到输入的文件:"projectPHPatbaidu.com"

 

  13.while循环 do while循环 for循环的语法规则和JavaScript是相同的,这里不再累赘。

    这里主要介绍一下foreach循环--该循环主要用于遍历数组

      语法(英文为syntax):

     

foreach($array as $value)
{
  //要执行的代码;
}

    注意:中间的是as 其中$array是一个数组,没进行一次循环,当前数组元素的值就会被赋值给$value变量(指针会注意的移动)。即第一次循环$value的值是数组中的第一个值,第二次循环$value的值是数组的第二个值,直到将这个数组被循环结束。  

 

   

   14.PHP中的函数

     PHP是世界上最好的语言,恐怕与它的函数不无关系吧!因为PHP的真正威力源自于它的函数,在PHP中,提供了超过1000个内建的函数。

   (1)创建PHP函数--语法如下:

function functionName()
{
 //要执行的代码;
}

      注意:函数的名称应该提示出它的功能,且函数名称应该以字母或下划线开头(不能以数字开头)。 

    PHP函数的执行和JavaScript及C++都是类似的--通过调用来执行。

         (2)添加参数

      和JS与C++一样,直接在函数名称后面的括号里即可添加参数,参数即为一个局部变量。

    (3)返回值

      类似的,如需让函数返回一个值,使用return语句即可实现。

      举例如下:

<?php
     function addFun($x,$y)
{
    $total=$x+$y;
    return $total;
}
    $TOTAL=addFun(90,10);
    echo "90+10的和为:".$TOTAL;   
?>

    

    15.PHP中的魔术变量

      PHP向它运行的任何脚本提供了大量的预定义常量。只是很多常量是由不同的扩展库定义的,只有在加载了这些扩展库是才会出现。下面会介绍8个魔术变量--它们的值会随着它们在代码中的位置改变而改变。

   (1)_LINE_  

    该变量的值依赖于它在脚本中所处的行来决定。且这些特殊而常量不区分大小写.如:

<?php
    echo \'这是第"\'._LINE_\'"行\';
?>

    上述实例输出这是第”2“行

   

           (2)_FILE_

      该变量会输出文件的完整路径(新版本PHP返回绝对路径)和文件名。如果用在被包含文件中,则返回被包含的文件名。如:

<?php
echo \'该文件位于 " \'  . __FILE__ . \' " \';
?>

  输出:"C:\wamp\www\example\index.php"

    

     (3) _DIR_

    该变量会返回文件所在的目录。如果用在被包含文件中,则返回被包括的文件所在目录。

 

     (4)_FUNCTION_

    该变量会返回函数名称(函数被定义时的名字)。如:

<?php
     function addFunc()
 
?>

           (5)_CLASS_

    返回的是该类被定义时的名字(区分大小写)。

     (6)_TRAIT_

    trait名包括其被声明的作用区域(例如Foo\Bar).

      (7)_METHOD_

    类的方法名,返回该方法被定义时的名字(区分大小写)。

      

<?php
function test() {
    echo  \'函数名为:\' . __METHOD__ ;
}
test();
?>

    结果输出:函数名为:test。

      (8)_NAMESPACE_

    当前命名空间的名称。(注意:命名空间这个概念在JavaScript中是没有的。

 

    16.PHP中的命名空间

  注意:命名空间在JavaScript中是没有这个概念的,在C++中有这个概念。实际上,命名空间有着相当重要的意义。它可以解决以下两类问题:

  • 用户编写的代码与PHP内部的类、函数、常量或第三方类、函数、常量之间的冲突。
  • 为很长的标识符名称创建一个别名,提高源代码的可读性。

  

  (1)定义命名空间

  我们可以通过关键字namespace来声明。如果一个文件中包含命名空间,它必须在其他所有的代码之前声明命名空间。如:

<?php
    namespace mySpace;
    //其他代码必须放在声明命名空间的语句之下。


?>

  注意:也可以定义多个不同的命名空间,如:

<?php
    namespace mySpace1;
    //mySpace1 这个命名空间下的代码


    namespace mySpace2;
    //mySpace2 这个命名空间下的代码
    

    namespace mySpace3;
    //mySpace3 这个命名空间下的代码


?>

    注意:在命名空间之前唯一合法的代码是用于定义源文件代码编码方式的declare语句。如declare(encoding="UTF-8");

 

   (2)定义子命名空间

    PHP命名空间也允许指定层次化的命名空间的名称。如namespace mySpace\Sub\

Level

   (3)命名空间的使用

    这一部分内容很多,可以看这里...

     

 

    17.PHP面向对象

  (1) 在面向对象的程序设计(Object-oriented programming,缩写为OOP)中,对象是一个由信息及对信息进行处理的描述所组成的整体,是对现实世界的抽象。

  在现实世界中,我们所面对的事情都是对象,如电脑,杯子,灯泡等。

  对象的三个主要的特性:

  1. 对象的形态:如颜色、大写、外形等等。
  2. 对象的行为:如跑、跳、开门等等。
  3. 对象的表示:相当于身份证。具体区分在相同的行为与状态下有什么不同。

   (2)面向对象的内容

      实际上,PHP和C++关于类这方面是很相似的。主要内容有:

  • 类-定义了一件事物的抽象特点
  • 对象-是类的实例
  • 成员变量-定义在类内部的变量,该变量的值对外是不可见的,类被初始化成对象后,该变量为对象的属性。
  • 成员函数-定义在类内部的可以访问对象的数据的函数
  • 继承-是子类自动共享父类数据结构的方法和机制。在js中是通过原型链继承的
  • 父类-可以被其他类继承,又称为基类或者超类。
  • 子类-一个类继承其他类称为子类,也可以称为派生类。
  • 多态-如不同的对象,接受到同一个消息可以产生不同的结果,这种现象称为多态性。
  • 重载-在js中没有重载,而php中有。重载即为函数或者方法有同样的名称,但是参数列表不相同的情况。
  • 抽象性-抽象性即为将具有一致的数据结构和行为的对象抽象成类。一个类就是这样一个抽象。
  • 封装-即将现实世界中存在的某个客体的属性和行为绑定在一起,并放置在一个逻辑单元内。
  • 构造函数-js中同样有构造函数,用来在创建对象时初始化对象。
  • 析构函数-C++中也有,js没有,它与构造函数相反,当对象结束其声明周期时(例如对对象所在的函数已经调用完毕),系统自动执行析构函数。它往往用来做“清理善后”的工作。比如在建立对象时用new开辟了一篇内存空间,应该在退出前在析构函数中使用delete释放。

  (3)创建对象

  如$merceds = new Car();  $bmw = new Car(),这样就通过Car类创建了三个对象。

  (4)PHP中类的定义

  

<?php
class phpClass {
  var $var1;
  var $var2 = "constant string";
  
  function myfunc ($arg1, $arg2) {
     [..]
  }
  [..]
}
?>

  这里需要注意:

  • 类使用class关键词,并在其后加上类的名称
  • 类名之后使用大括号来定义类的变量和方法
  • 类的变量使用var来声明,变量也可以初始化值。与js同,用var,都是弱类型语言。

  在PHP中,也有this,假设我们已经定义了一个类,并且基于类实例化了对象,那么我们就可以通过对象调用成员方法了。如下所示:

$baidu->setTitle("百度一下");
$baidu->setUrl("baidu.com");
$baidu->getTitleAndUrl();

  注意到,在php中调用方法时使用的时->而没有使用js中的.是因为php中.是并置运算符用于将字符串连接的,所以使用->来调用方法。

  

  (5)继承:通过extends关键字来继承一个类,如:

class Child extends Parent{
}

    (6)方法重写:如果从父类继承的方法不能满足子类的要求,那么可以对其进行改写,这个过程实际上叫做方法的覆盖(override),也成为方法的重写。

    

        (7)访问控制:这个和C++相似,即在属性或者方法的前面添加关键字public(公有)、 protected(受保护)、 private(私有)来实现。

  • 公有的类成员可以在任何地方被访问
  • 受保护的类成员可以被其自身及其子类和父类访问
  • 私有的成员只能被其定义所在的类访问。

   (8)接口:通过接口(interface),可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。接口是通过interface关键字来定义的,就像是定义一个标准的类一样,但是其中定义的所有方法都是空的。并且接口中定义的方法都必须是共有的,这是接口的特性。要实现一个接口,必须使用implements操作符。类中必须实现接口中定义的所有方法,否则会报一个致命错误。类可以实现多个接口,用逗号来分隔多个接口的名称。举例如下:

    

<?php
// 声明一个"iTemplate“接口
interface iTemplate
{
    public function setVariable($name,$var);
    public function getHtml($template); 
}

//实现接口
class Template implements iTemplate
{
   private vars = array();
   public function setVariable ($name,$var)
   {
      $this->vars[$name]=$var;    
   }
   public function getHtml($template)
   {
      foreach($this->vars as $name->$value){
         $template = str_replace(\'{\' . $name . \'}\', $value, $template);
      }
       return $template;
   }
}
?>

   (9)常量,可以把类中始终不变的量定义为常量,不需要使用$符号。

           常量的值必须是一个定值。如:const constant="8";

       (10)抽象类 、调用父类构造函数。。。

 

第三部分:表单

   实际上,对于PHP,我最希望的就是学习表单这一部分了,这一部分,对于前端工程师而言,我相信是必须掌握的,这样才能和后端顺利的交流,协调工作。

  一、表单和用户输入

   1. 对于一个表单(html),当被发送时,PHP能把来自HTML页面的表单元素自动变成可供PHP脚本使用。

  如下面的html代码:

<html>
<head>
<meta charset="utf-8">
<title>菜鸟教程(runoob.com)</title>
</head>
<body>

<form action="welcome.php" method="post">
名字: <input type="text" name="fname">
年龄: <input type="text" name="age">
<input type="submit" value="提交">
</form>

</body>
</html>

  当用户填完上面的表单并点击提交按钮之后,表单的数据就会被送往名为welcome.php文件,welcome.php文件通过下面的语句就可以对该表单进行相应的操作:

欢迎<?php echo $_POST("fname"); ?>!<br>
你的年龄是<?php echo $_POST["age"];?>岁

    

  二.表单验证

    客户端?or 服务器?

    实际上表单验证应该通过客户端脚本(js)进行验证,因为浏览器验证速度更快,并且可以减轻服务器额负载。

    但是当验证用户输入需要插入数据库,这是就应该考虑使用服务器验证。在服务器验证的一种好的方式是:把表单传过去而不是传一个页面,这样用户就可以在同一张表单页面上得到错误信息,用户也就更容易发现错误了。

    这里我们当然只介绍服务器验证即PHP表单验证---because为了防止黑客,并且为了防止垃圾信息

    

 

比如下面的这样一个PHP表单验证,名字必须只能包含字母和空格。E-mail必须包含@ 和. 。网址必须是一个有效的URL,性别必须选择一个,这是怎么做到的呢?

      先让我们看看html代码:

“名字”: <input type="text" name="name">
E-mail: <input type="text" name="email">
网址: <input type="text" name="website">
备注: <textarea name="comment" rows="5" cols="40"></textarea>
性别:
<input type="radio" name="gender" value="female">女
<input type="radio" name="gender" value="male">男

  

  另外还必须有一个HTML表单代码如下:

<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">

  其中,我们使用了method="post";方法来提交数据。刚刚介绍过 $_SERVER是一个超级全局变量,会返回正在执行脚本的文件名。因此$_SERVER["PHP_SELF"]会发送表单数据到当前页面,而不是跳转到不同的页面。而htmlspecialchars() 函数把一些预定义的字符转换为 HTML 实体。预定义的字符是:&、”、‘、<、>。而通过htmlspecialchars()函数可以避免被黑客攻击。  因为任何js代码可以添加在<script>标签中!黑客可以通过这一点来重定向页面到另一台服务器。

   当用户提交表单时,我们可以做:

  • 使用PHP trim()函数去除用户输入数据中不必要的字符
  • 使用PHP stripslashed()函数去除用户输入数据中的反斜杠\。

 

   知道了这些后,接下来我们可以将这些过滤的函数写在一个我们自己定义的函数中,这样可以大大提高代码的复用性。将函数命名为test_input().

  现在,我们可以通过test_input()函数来检测$_POST中的所有变量。脚本代码如下所示:

<?php
//定义变量并且默认设置位空值
$name=$email=$gender=$comment=$website="";//这种是连续赋值的方式

if($_SERVER["REQUEST_METHOD"]=="POST") //关键REQUEST_METHOD包括POST 和 GET
{
    $name=test_input($_POST["name"]); 
// $_POST("name")得到的是name属性值为name的表单的value,以下同理 $email=test_input($_POST["email"]); $website=test_input($_POST["website"]); $gender=test_input($_POST["gender"]); } function test_input($data) { $data=trim($data);//把多余的空格去掉 $data=stripslashed($data);//把其中不应该出现的反斜杠去掉 $data=hmtlspecialchars($data);//实体化html代码 return $data;//返回这个新的被修改过的数据 } ?>

 

 

   三、表单中的必需字段

  如何使得一个字段为必需字段呢?我们可以试用php中的empty()函数,如果为空,则显示对应的错误信息,如果不为空,则将数据传递给test_input()函数。

  下面是一段用于处理是否为空的PHP代码:

<?php
// 定义变量并默认设为空值
$nameErr = $emailErr = $genderErr = $websiteErr = "";
$name = $email = $gender = $comment = $website = "";

if ($_SERVER["REQUEST_METHOD"] == "POST") {
  if (empty($_POST["name"])) {  //注意:empty函数可以验证是否为空值
    $nameErr = "名字是必需的。";
  } else {
    $name = test_input($_POST["name"]);
 //如果不是空值,则将$_POST["name"]传给test_input(),防止不能正常处理或遭受黑客攻击
  }

  if (empty($_POST["email"])) {
    $emailErr = "邮箱是必需的。";
  } else {
    $email = test_input($_POST["email"]);
  }

  if (empty($_POST["website"])) {
    $website = "";
  } else {
    $website = test_input($_POST["website"]);
  }

  if (empty($_POST["comment"])) {
    $comment = "";
  } else {
    $comment = test_input($_POST["comment"]);
  }

  if (empty($_POST["gender"])) {
    $genderErr = "性别是必需的。";
  } else {
    $gender = test_input($_POST["gender"]);
  }
}
?>

    上面的代码中指出如果为空,则把一个字符串赋值给变量,那么怎么显示错误信息呢?

  实际上,我们可以为每个字段添加一些脚本,各个脚本会在信息输入错误是显示对应的错误信息。如下所示:

<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>"> 
   名字: <input type="text" name="name">
   <span class="error">* <?php echo $nameErr;?></span>
   <br><br>
   E-mail: <input type="text" name="email">
   <span class="error">* <?php echo $emailErr;?></span>
   <br><br>
   网址: <input type="text" name="website">
   <span class="error"><?php echo $websiteErr;?></span>
   <br><br>
   备注: <textarea name="comment" rows="5" cols="40"></textarea>
   <br><br>
   性别:
   <input type="radio" name="gender" value="female">女
   <input type="radio" name="gender" value="male">男
   <span class="error">* <?php echo $genderErr;?></span>
   <br><br>
   <input type="submit" name="submit" value="Submit"> 
</form>

  

  四、php表单验证邮件和URL

  以下代码可以通过简单的方式来检测name字段是否包含字母和空格,如果name字段值不合法,将输出错误信息:

$name = test_input($_POST["name"]);
if (!preg_match("/^[a-zA-Z ]*$/",$name)) {
  $nameErr = "只允许字母和空格"; 
}

  其中preg_match()函数将会进行正则表达式匹配,语法如下;

int preg_match(string $pattern ,string $subject)

  即在subject字符串中搜索与pattern给出的正则表达式相匹配的内容。

 

  同样的,下面的代码可以验证e-mail地址是否合法,如果不合法,将输出错误信息:

$email = test_input($_POST["email"]);
if (!preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/",$email)) {
  $emailErr = "非法邮箱格式"; 
}

  

      验证url等不再举例,因为这里涉及到正则表达式,这里我还不是很清楚,后面会详细学习正则表达式。

 

  五、确保在表单中输入值

  在用户点击提交按钮后,为确保字段值输入正确,我们在HTML的input元素中插入PHP脚本,

如下所示:

<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>"> 
   名字: <input type="text" name="name" value="<?php echo $name;?>">
   <span class="error">* <?php echo $nameErr;?></span>
   <br><br>
   E-mail: <input type="text" name="email" value="<?php echo $email;?>">
   <span class="error">* <?php echo $emailErr;?></span>
   <br><br>
   网址: <input type="text" name="website" value="<?php echo $website;?>">
   <span class="error"><?php echo $websiteErr;?></span>
   <br><br>
   备注: <textarea name="comment" rows="5" cols="40"><?php echo $comment;?></textarea>
   <br><br>
   性别:
   <input type="radio" name="gender" <?php if (isset($gender) && $gender=="female") echo "checked";?>  value="female">女
   <input type="radio" name="gender" <?php if (isset($gender) && $gender=="male") echo "checked";?>  value="male">男
   <span class="error">* <?php echo $genderErr;?></span>
   <br><br>
   <input type="submit" name="submit" value="Submit"> 
</form>

  

  六、$_GET变量

  这个变量用于收集来自method="get"的表单中的值。注意:从带有get方法的表单发送的信息,对任何人都是可见的(会显示在浏览器的地址栏),并且对发送信息的量也有限制。如下面所示的html代码:

<html>
<head>
<meta charset="utf-8">
<title>菜鸟教程(runoob.com)</title>
</head>
<body>

<form action="welcome.php" method="get">
名字: <input type="text" name="fname">
年龄: <input type="text" name="age">
<input type="submit" value="提交">
</form>

</body>
</html>

  这个代码在我们写页面时是经常可以看到的。但是之前我一直不知道当用户点击了“submit”按钮之后的情况。实际上,点击之后,发送到服务其的URL如下所示:

  http://www.runoob.com/welcome.php?fname=Runoob$amp;age=3

  

  

  自此,"welcom.php"文件就可以通过$_GET变量来收集表单数据了(注意:表单域的名称会自动成为#_GET数组的键

   注意:

  • 因为在使用method=“get”时,所有额变量名和值都会显示在URL中。所以在发送密码或者其他敏感信息时,不应该使用这个方法。   
  • 然而,也正因为变量显示在了URL中,所以可以在收藏夹中收藏该页面,因此,在某些情况下,还是很有用的。
  • HTTP GET方法不适合大型的变量值,因为它的值是不能超过2000个字符的。

 

  七.$_POST变量

    显然,它是用来收集来自method="post"的表单中的值的。注意:从带有POST方法的表单发送的信息,对任何人都是不可见的(不会显示在浏览器的地址栏),因此无法把页面加入书签,并且对发送信息的量也没有限制。(实际上,默认情况下,POST方法的发送信息的量最大值为8MB)

       下面是一个html代码,其中有method="post"的表单

<html>
<head>
<meta charset="utf-8">
<title>菜鸟教程(runoob.com)</title>
</head>
<body>

<form action="welcome.php" method="post">
名字: <input type="text" name="fname">
年龄: <input type="text" name="age">
<input type="submit" value="提交">
</form>

</body>
</html>

  

  八.$_REQUEST变量

  这个变量包含了$_GET $_POST 和$_COOKIE的内容,所以它可以用来收集get方法和post方法发送的表单数据。

   当用户点击 "提交" 按钮时,URL 类似如下所示:

http://www.runoob.com/welcome.php

    现在welcom.php文件可以通过$_POST变量来收集表单数据了(请注意,表单域的名称会自动成为 $_POST 数组中的键)。