PHP学习基础第二节

作者: 空谷悠 | 来源:发表于2017-01-03 13:59 被阅读153次

    一、数组

    1、数组定义

    数组就是一个键值对组成的语言结构,键类似于酒店的房间号,值类似于酒店房间里存储的东西。

    $arr=array();表示创建一个空数组,并把创建的空数组赋值给变量$arr。

    print_r($arr)打印数组

    2、PHP数组之索引数组初始化

    php数组,根据索引值的不同分为两种:索引数组、关联数组。

    索引和关联两个词都是针对数组的键而言的。

    索引数组是指数组的键是整数的数组,并且键的整数顺序是从0开始,依次类推。

    $fruit = array("苹果","香蕉","菠萝");注意数组的键是从0开始的。可以使用print_r($fruit);语句输出数组键及对应的值。

    <?php

    $fruit=array("苹果","香蕉","菠萝");

    print_r($fruit);                       //Array([0] => 苹果[1] => 香蕉[2] => 菠萝)

    ?>

    3、PHP数组之索引数组赋值

    索引数组赋值有三种方式:

    第一种:用数组变量的名字后面跟一个中括号的方式赋值,当然,索引数组中,中括号内的键一定是整数。比如,$arr[0]='苹果';

    第二种:用array()创建一个空数组,使用=>符号来分隔键和值,左侧表示键,右侧表示值。当然,索引数组中,键一定是整数。比如,array('0'=>'苹果');

    第三种:用array()创建一个空数组,直接在数组里用英文的单引号'或者英文的双引号"赋值,数组会默认建立从0开始的整数的键。比如array('苹果');这个数组相当于array('0'=>'苹果');

    4、PHP数组之访问索引数组内容

    有的时候我们需要把数组中的内容也就是值取出来该怎么办呢?用数组变量的名字后跟的中括号中的键,来访问数组中的值。

    <?php

    $fruit = array('苹果','香蕉');

    $fruit0 = $fruit['0'];

    print_r($fruit0);//结果为苹果

    ?>

    上面代码的作用:先把一个数组$fruit第一个值取出来然后赋给一个变量$fruit0,最后输出变量值。

    5、PHP数组之for循环访问索引数组里的值

    for循环可以将数组里的所有值都访问到,下面我们展示下,用for循环访问索引数组里的值。

    <?php

    $fruit=array('苹果','香蕉','菠萝');

    for($i=0; $i<3; $i++){

    echo '<br/>数组第'.$i.'值是:'.$fruit[$i];

    }

    6、PHP数组之foreach循环访问索引数组里的值

    foreach循环可以将数组里的所有值都访问到,下面我们展示下,用foreach循环访问索引数组里的值。

    <?php

    $fruit=array('苹果','香蕉','菠萝');

    foreach($fruit as $k=>$v){

    echo '<br/>第'.$k.'值是:'.$v;

    }

    ?>

    7、PHP数组之关联数组初始化

    关联数组是指数组的键是字符串的数组。

    $fruit = array(

    'apple'=>"苹果",

    'banana'=>"香蕉",

    'pineapple'=>"菠萝"

    );

    可以使用print_r($fruit);语句输出数组键及对应的值。

    8、PHP数组之关联数组赋值

    关联数组赋值有两种方式:

    第一种:用数组变量的名字后面跟一个中括号的方式赋值,当然,关联数组中,中括号内的键一定是字符串。比如,$arr['apple']='苹果';

    第二种:用array()创建一个空数组,使用=>符号来分隔键和值,左侧表示键,右侧表示值。当然,关联数组中,键一定是字符串。比如,array('apple'=>'苹果');

    9、PHP数组之访问关联数组内容

    用数组变量的名字后跟中括号+键的方式来访问数组中的值,键使用单引号或者双引号括起来。

    $fruit = array('apple'=>"苹果",'banana'=>"香蕉",'pineapple'=>"菠萝"); 

    $fruit0 =$fruit['banana'];

    print_r($fruit0);

    10、PHP数组之foreach循环访问关联数组里的值

    $fruit=array('apple'=>"苹果",'banana'=>"香蕉",'pineapple'=>"菠萝");

    foreach($fruit   as    $k=>$v){  

      echo    '<br/>水果的英文键名:'.$k.',对应的值是:'.$v;

    }

    11.使用range( )建立一个包含指定范围单元的数组

    $num=range(1,10);

    print_r($num);

    $letter=range("a","z");

    print_r($letter);

    12.unset( )删除数组元素

    $arr=array("city1"=>"北京","city2"=>"上海","city3"=>"深圳");

    unset($arr["city3"]);

    print_r($arr);//打印新的数组

    13.count( )取得数组的长度

    $arr=array("city1"=>"北京","city2"=>"上海","city3"=>"深圳");

    echo   count($arr);

    14.in_array("北京",$arr)检查数组中是否包含某个值

    第一个参数是要判断的值,第二个参数是要判断的数组,返回值是一个布尔值

    arr=array("city1"=>"北京","city2"=>"上海","city3"=>"深圳");

    var_dump(in_array("北京", $arr));

    15.sort()根据首字母来进行正向的排序,根据值进行排序

    $arr=array("a","z","g","t");

    sort($arr);

    print_r($arr);

    rsort()根据首字母来进行反向的排序,根据值进行排序

    16.根据索引进行排序

    ksort()根据索引进行升序排序

    krsort()根据索引进行降序排序

    $arr=array("c"=>"d2c","g"=>"ff545g","f"=>"5435f","a"=>"8675a");

    ksort($arr);//ksort()根据索引进行升序排序

    print_r($arr);

    krsort($arr);//krsort()根据索引进行降序排序

    print_r($arr);

    17.二维数组

    $arr=array("city1"=>"北京","city2"=>"上海","city3"=>array("拉萨","普罗旺斯"));

    foreach($arr   as    $k => $v) {

    if($k != "city3"){

    echo   "<br/>";

    echo   $v;

    }else{

    //双层循环数组

    foreach($v  as   $kk=>$vv){

    echo    "<br/>";

    echo   $vv;}}}

    //循环多维数组

    //引入文件

    include   "adress.php";

    foreach($adress   as   $k => $v) {

    echo"省名:". $v["province_name"]."<br/>";

    if(!empty($v["city"])) {

    foreach($v["city"]   as     $key => $val) {

    echo"    市名:". $val["city_name"]."<br/>";

    if(!empty($val["area"])) {

    foreach($val["area"]    as    $kk => $vv) {

    echo"        区名:". $vv."<br/>";}}}}}


    二、函数

    1、php自定义函数

    PHP内置了超过1000个函数,因此函数使得PHP成为一门非常强大的语言。大多数时候我们使用系统的内置函数就可以满足需求,但是自定义函数通过将一组代码封装起来,使代码进行复用,程序结构与逻辑更加清晰。

    PHP函数的定义方式:

    1.使用关键字“function”开始

    2.函数名可以是字母或下划线开头:function name()

    3.在大括号中编写函数体:

    function name() {

    echo 'Eric';

    }

    通过上面的步骤,我们就定义了一个简单的函数,当我们需要的时候,就可以在代码中调用这个函数,调用方法为函数名+参数,例如:name();

    调用的时候不区分大小写,不过在调用函数时,通常使用其在定义时的形式。

    函数名称是由字母或下划线开始,中间可以包含数字

    php不支持函数重载,所以自定义函数不能和内置函数重名

    不能在一个文件中自定义同名的函数

    局部变量:函数体内定义的变量为局部变量,只在函数体内可见

    局部变量的作用域:从声明它的那条语句开始到函数结束

    2、php函数的参数

    PHP的函数可以没有参数,也可以有若干个参数,多个参数称之为参数列表,采用逗号进行分割,参数类似于一个变量,调用时用来传递数据到函数体中。通过传递参数可以使函数实现对参数的运算,得到我们想要的结果。

    参数的变量名可以自由指定,但最好能够表达相关的意思,常用的设定参数的方法为:

    function sum($a, $b) {

    return $a+$b;

    }

    支持默认参数,如果不给参数,就会调用默认的参数

    function test2($b="123"){

    echo $b;

    }

    test2();

    传值

    $d=10;

    function test3($c){$c=5;}

    test($d);

    echo $d;//打印结果是10,只传值,不传址

    传址

    $e=10;

    function test4(&$f){$f=5;}

    test4($e);//打印结果是5,加了&,引用同一个地址

    echo $e;

    3、php函数之返回值

    使用return关键字可以使函数返回值,可以返回包括数组和对象的任意类型,如果省略了 return,则默认返回值为 NULL。

    function add($a) {

    return $a+1;

    }

    $b = add(1);

    返回语句会立即中止函数的运行,并且将控制权交回调用该函数的代码行,因此下面函数的返回值跟上面的函数是一样的。

    function add($a) {

    return $a+1;

    $a = 10;

    return $a+20;

    }

    $b = add(1);

    函数不能返回多个值,但可以通过返回一个数组来得到类似的效果。

    function numbers() {

    return array(1, 2, 3);

    }

    list ($one, $two, $three) = numbers();

    4、PHP函数之可变函数

    所谓可变函数,即通过变量的值来调用函数,因为变量的值是可变的,所以可以通过改变一个变量的值来实现调用不同的函数。经常会用在回调函数、函数列表,或者根据动态参数来调用不同的函数。可变函数的调用方法为变量名加括号。

    function name() {

    echo   'jobs';

    }

    $func = 'name';

    $func(); //调用可变函数

    可变函数也可以用在对象的方法调用上。

    class book {

    function getName() {

    return 'bookname';

    }

    }

    $func = 'getName';

    $book = new book();

    $book->$func();

    5、PHP函数之内置函数

    内置函数指的是PHP默认支持的函数,PHP内置了很多标准的常用的处理函数,包括字符串处理、数组函数、文件处理、session与cookie处理等。

    我们先拿字符串处理函数来举例,通过内置函数str_replace可以实现字符串的替换。下面的例子将“jobs”替换成“steven jobs”:

    $str = 'i am jobs.';

    $str1 = str_replace('jobs', 'steven jobs', $str);

    echo     $str1; //结果为“i am steven jobs”

    另外一些函数是通过其他扩展来支持的,比如mysql数据库处理函数,GD图像处理函数,邮件处理函数等,PHP默认加载了一些常用的扩展库,我们可以安装或者加载其他扩展库来增加PHP的处理函数。

    6 、PHP函数之判断函数是否存在

    当我们创建了自定义函数,并且了解了可变函数的用法,为了确保程序调用的函数是存在的,经常会先使用function_exists判断一下函数是否存在。同样的method_exists可以用来检测类的方法是否存在。

    function func() {

    }

    if (function_exists('func')){

    echo   "存在";

    }

    类是否定义可以使用class_exists。

    lass MyClass{

    }

    // 使用前检查类是否存在

    if (class_exists('MyClass')) {

    $myclass = new MyClass();

    }

    PHP中有很多这类的检查方法,例如文件是否存在file_exists等。

    $filename = 'test.txt';

    if (!file_exists($filename)) {

    echo $filename . ' not exists.';

    }

    7.函数的作用域,函数里面取不到外面的东西,作用域在函数内部有效,函数的里面的东西外面也取不到

    $aa=10;//外面定义一个变量,在函数里面是访问不到的,可以通过传参取到外面的变量

    function ccc(){

    //echo $aa;

    }

    ccc();

    通过global,取到外面的变量

    $aa=10;

    function cccc(){

    global $aa;//申明$aa是一个全局变量

    echo $aa;

    }

    cccc();

    超全局变量,用$GLOBALS设置

    function test(){

    $a=10;

    $GLOBALS["a"]=$a;//超全局变量

    }

    test();

    echo $GLOBALS['a'];

    详解global和$GLOBALS[]的区别:

    1.$GLOBALS[‘var’]是外部的全局变量本身

    2.global $var是外部$var的同名引用或者指针

    <?php

    $var1 = 1;

    $var2 = 2;

    function test(){

    $GLOBALS[‘var2′] = &$GLOBALS[‘var1′];

    }

    test();

    echo $var2;//正常打印结果为1

    ?>

    <?php

    $var1 = 1;

    $var2 = 2;

    function test(){

    global $var1,$var2;

    $var2 = &$var1;

    }

    test();

    echo $var2;//意外打印结果为2.为什么会打印结果为2呢?其实就是因为$var1的引用指向了$var2的引用地址。导致实质的值没有改变。

    ?>

    我们再来看一个例子吧。

    <?php

    $var1 = 1;

    function test(){

    unset($GLOBALS[‘var1′]);

    }

    test();

    echo $var1;//因为$var1被删除了,所以什么东西都没有打印

    ?>

    <?php

    $var1 = 1;

    function test(){

    global $var1;

    unset($var1);

    }

    test();

    echo $var1;//意外的打印了1。证明删除的只是别名|引用,其本身的值没有受到任何的改变.

    明白了吧?也就是说global $var其实就是$var = &$GLOBALS[‘var’]。调用外部变量的一个别名而已

    ?>

    8.函数递归,方法一

    $num=1;

    function test($num){

    $num++;

    if($num<5){

    echo $num;

    test($num);//递归,满足条件调用函数

    }else{

    return;

    }

    }

    test($num);//把$num当做参数传到函数里面去

    用递归处理阶乘问题

    function    factorial($num){

    if($num>0){

    return   $num*factorial($num-1);

    }else{

    return   1;}}

    echo    factorial(5);//调用,打印

    9.函数递归,方法二,静态变量

    静态变量(每次调用完成后会记住上一次的值),也叫常驻内存,关键字是static

    function test(){

    static $num=1;

    $num++;

    if($num<5){

    echo $num;

    test();

    }else{

    return;}}

    test();


    三、PHP类与面向对象

    1.php类和对象

    类是面向对象程序设计的基本概念,通俗的理解类就是对现实中某一个种类的东西的抽象, 比如汽车可以抽象为一个类,汽车拥有名字、轮胎、速度、重量等属性,可以有换挡、前进、后退等操作方法。

    通常定义一个汽车类的方法为:

    class     Car {    

    var   $name = '汽车';  

      function getName() {      

      return $this->name;   

     }}

    类是一类东西的结构描述,而对象则是一类东西的一个具体实例,例如汽车这个名词可以理解为汽车的总类,但这辆汽车则是一个具体的汽车对象。

    对象通过new关键字进行实例化:

    $car = new Car();

    echo $car->getName();

    类与对象看起来比较相似,但实际上有本质的区别,类是抽象的概念,对象是具体的实例。类可以使程序具有可重用性。

    <?php

    //定义一个类

    class   Car {

    var    $name = '汽车';

    function    getName() {

    return    $this->name;

    }

    }

    //实例化一个car对象

    $car = new    Car();

    $car->name = '奥迪A6'; //设置对象的属性值

    echo    $car->getName();  //调用对象的方法 输出对象的名字

    ?>

    2.PHP类和对象之创建一个对象

    类的定义方法,类通过关键字class开头,然后是类名与花括号,在花括号中定义类的属性与方法。类名必须是字母或下划线开头,后面紧跟若干个字母、数字或下划线,类名最好能够表意,可以采用名词或者英文单词。

    /定义一个类

    class   Car {

    //定义属性

    public    $name = '汽车';

    //定义方法

    public   function   getName() {

    //方法内部可以使用$this伪变量调用对象的属性或者方法

    return     $this->name;

    }

    }

    要创建一个类的实例,可以使用new关键字创建一个对象。

    $car = new     Car();

    //也可以采用变量来创建

    $className = 'Car';

    $car = new    $className();

    3.PHP类和对象之类的属性

    在类中定义的变量称之为属性,通常属性跟数据库中的字段有一定的关联,因此也可以称作“字段”。属性声明是由关键字 public,protected 或者 private 开头,后面跟一个普通的变量声明来组成。属性的变量可以设置初始化的默认值,默认值必须是常量。

    访问控制的关键字代表的意义为:

    public:公开的

    protected:受保护的

    private:私有的

    class Car {

    //定义公共属性

    public $name = '汽车';

    //定义受保护的属性

    protected $corlor = '白色';

    //定义私有属性

    private $price = '100000';

    }

    默认都为public,外部可以访问。一般通过->对象操作符来访问对象的属性或者方法,对于静态属性则使用::双冒号进行访问。当在类成员方法内部调用的时候,可以使用$this伪变量调用当前对象的属性。

    $car = new Car();

    echo $car->name;  //调用对象的属性

    echo $car->color;  //错误 受保护的属性不允许外部调用

    echo $car->price;  //错误 私有属性不允许外部调用

    受保护的属性与私有属性不允许外部调用,在类的成员方法内部是可以调用的。

    class   Car{    

    private  $price = '1000';   

     public  function  getPrice() {       

     return  $this->price; //内部访问私有属性​

    }}

    4.PHP类和对象之定义类的方法

    方法就是在类中的function,很多时候我们分不清方法与函数有什么差别,在面向过程的程序设计中function叫做函数,在面向对象中function则被称之为方法。

    同属性一样,类的方法也具有public,protected 以及 private 的访问控制。

    访问控制的关键字代表的意义为:

    public:公开的

    protected:受保护的

    private:私有的

    们可以这样定义方法:

    class  Car {

    public  function  getName() {

    return  '汽车';

    }

    ​}

    $car = new  Car();

    echo  $car->getName();

    使用关键字static修饰的,称之为静态方法,静态方法不需要实例化对象,可以通过类名直接调用,操作符为双冒号::。

    class Car {

    public static function getName() {

    return '汽车';

    }

    ​}

    echo Car::getName(); //结果为“汽车”

    5.PHP类和对象之构造函数和析构函数

    PHP5可以在类中使用__construct()定义一个构造函数,具有构造函数的类,会在每次对象创建的时候调用该函数,因此常用来在对象创建的时候进行一些初始化工作。

    class Car {

     function__construct(){    

      print "构造函数被调用\n"; 

     }}

    $car = new Car(); //实例化的时候 会自动调用构造函数__construct,这里会输出一个字符串

    在子类中如果定义了__construct则不会调用父类的__construct,如果需要同时调用父类的构造函数,需要使用parent::__construct()显式的调用。

    class  Car {//父类

    function  __construct() {

    print  "父类构造函数被调用\n";

    }

    }

    class  Truck  extends  Car {//子类

    function  __construct() {

    print  "子类构造函数被调用\n";

    parent::__construct();

    }

    }

    $car = new  Truck();

    同样,PHP5支持析构函数,使用__destruct()进行定义,析构函数指的是当某个对象的所有引用被删除,或者对象被显式的销毁时会执行的函数。

    class  Car {

      function  __construct() {    

      print  "构造函数被调用 \n"; 

     }

      function __destruct(){    

      print  "析构函数被调用 \n"; 

     }}

    $car = new  Car(); //实例化时会调用构造函数

    echo '使用后,准备销毁car对象 \n';

    unset($car); //销毁时会调用析构函数

    6.PHP类和对象之Static静态关键字

    静态属性与方法可以在不实例化类的情况下调用,直接使用类名::方法名的方式进行调用。静态属性不允许对象使用->操作符调用。

    class Car {

    private static $speed = 10;

    public static function getSpeed() {

    return self::$speed;

    }

    }

    echo Car::getSpeed();  //调用静态方法

    静态方法也可以通过变量来进行动态调用

    $func = 'getSpeed';

    $className = 'Car';

    echo $className::$func();  //动态调用静态方法

    静态方法中,$this伪变量不允许使用。可以使用self,parent,static在内部调用静态方法与属性。

    class Car {  

      private static $speed = 10;        

    public static function getSpeed() {       

     return self::$speed;   

     }        

    public static function speedUp() {   

         return self::$speed+=10;   

     }}

    class BigCar extends Car {

        public static function start() {       

     parent::speedUp();   

     }}

    BigCar::start();

    echo BigCar::getSpeed();

    7.PHP类和对象之访问控制

    访问控制通过关键字public,protected和private来实现。被定义为公有的类成员可以在任何地方被访问。被定义为受保护的类成员则可以被其自身以及其子类和父类访问。被定义为私有的类成员则只能被其定义所在的类访问。

    类属性必须定义为公有受保护私有之一。为兼容PHP5以前的版本,如果采用 var 定义,则被视为公有。

    class  Car {  

     $speed = 10;//错误 属性必须定义访问控制

    public   $name;  //定义共有属性

    }

    类中的方法可以被定义为公有私有受保护。如果没有设置这些关键字,则该方法默认为公有

    class Car {

    ​    //默认为共有方法

    function turnLeft() {

    }

    }

    如果构造函数定义成了私有方法,则不允许直接实例化对象了,这时候一般通过静态方法进行实例化,在设计模式中会经常使用这样的方法来控制对象的创建,比如单例模式只允许有一个全局唯一的对象。

    class Car {

    private function __construct() {

    echo 'object create';

    }

    private static $_object = null;

    public static function getInstance() {

    if (empty(self::$_object)) {

    self::$_object = new Car(); //内部方法可以调用私有方法,因此这里可以创建对象

    }

    return self::$_object;

    }

    }

    //$car = new Car(); //这里不允许直接实例化对象

    $car = Car::getInstance(); //通过静态方法来获得一个实例

    8、PHP类和对象之对象继承

    继承是面向对象程序设计中常用的一个特性,汽车是一个比较大的类,我们也可以称之为基类,除此之外,汽车还分为卡车、轿车、东风、宝马等,因为这些子类具有很多相同的属性和方法,可以采用继承汽车类来共享这些属性与方法,实现代码的复用。

    9、PHP类和对象之重载

    PHP中的重载指的是动态的创建属性与方法,是通过魔术方法来实现的。属性的重载通过__set,__get,__isset,__unset来分别实现对不存在属性的赋值、读取、判断属性是否设置、销毁属性。

    class Car {

    private $ary = array();

    public function __set($key, $val) {

    $this->ary[$key] = $val;

    }

    public function __get($key) {

    if (isset($this->ary[$key])) {

    return $this->ary[$key];

    }

    return null;

    }

    public function __isset($key) {

    if (isset($this->ary[$key])) {

    return true;

    }

    return false;

    }

    public function __unset($key) {

    unset($this->ary[$key]);

    }

    }

    $car = new Car();

    $car->name = '汽车';  //name属性动态创建并赋值

    echo $car->name;

    方法的重载通过__call来实现,当调用不存在的方法的时候,将会转为参数调用__call方法,当调用不存在的静态方法时会使用__callStatic重载。

    class Car {

    public $speed = 0;

    public function __call($name, $args) {

    if ($name == 'speedUp') {

    $this->speed += 10;

    }

    }

    }

    $car = new Car();

    $car->speedUp(); //调用不存在的方法会使用重载

    echo $car->speed;

    10、PHP类和对象之对象的高级特性

    对象比较,当同一个类的两个实例的所有属性都相等时,可以使用比较运算符==进行判断,当需要判断两个变量是否为同一个对象的引用时,可以使用全等运算符===进行判断。

    class Car {

    }

    $a = new Car();

    $b = new Car();

    if ($a == $b) echo '==';  //true

    if ($a === $b) echo '==='; //false

    对象复制,在一些特殊情况下,可以通过关键字clone来复制一个对象,这时__clone方法会被调用,通过这个魔术方法来设置属性的值。

    class Car {

    public $name = 'car';

    public function __clone() {

    $obj = new Car();

    $obj->name = $this->name;

    }

    }

    $a = new Car();

    $a->name = 'new car';

    $b = clone $a;

    var_dump($b);

    对象序列化,可以通过serialize方法将对象序列化为字符串,用于存储或者传递数据,然后在需要的时候通过unserialize将字符串反序列化成对象进行使用。

    class Car {

    public $name = 'car';

    }

    $a = new Car();

    $str = serialize($a); //对象序列化成字符串

    echo $str.'<br/>';

    $b = unserialize($str); //反序列化为对象

    var_dump($b);

    11.include和require

    include() 语句将在其被调用的位置处包含一个文件

    include_once()的作用与include()相同,不过它会首先验证是否已经包含了该文件,如果已经包含,则不再执行include_once()

    include  "031.php";//引入php文件

    include   "033.html";//引入html文件

    echo   $a;//可以直接取到引用的文件的里面的变量

    require()与include()一样,只不过require()我们通常放在php程序的最前面

    require_once与include_once()一样,但是也要放在php程序的最前面

    include和require的区别:

    require一个文件存在错误的话,那么程序就会中断执行了,并显示致命错误

    include一个文件存在错误的话,那么程序不会中断,而是继续执行,并显示一个警告错误。

    include (或 require)语句会获取指定文件中存在的所有文本/代码/标记,并复制到使用 include 语句的文件中。

    包含文件很有用,如果您需要在网站的多张页面上引用相同的 PHP、HTML 或文本的话。

    相关文章

      网友评论

      • McDu:''其实就是因为$var1的引用指向了$var2的引用地址''
        为什么 $var1的引用指向 $var2 ? $var1 不是= 1吗? &$var1不是也是1吗?
        我哪里理解的不对?麻烦赐教
        空谷悠:其实这个就是传值和传址的区别。不好意思额,刚看到。

      本文标题:PHP学习基础第二节

      本文链接:https://www.haomeiwen.com/subject/bjagvttx.html