PHP学习笔记11:类和对象

来源:互联网 发布:信长野望长野业正数据 编辑:程序博客网 时间:2024/05/17 07:07

1. 定义一个类

class Car{    var $name ='汽车';    function getName(){        return $this->name;    }}
var代表属性,function代表方法

2. 创建一个类的实例

$car = new Car();//也可以采用变量来创建$className='Car';$car=new $className();
3. 类的属性

类中定义的变量称之为属性,也称为字段。可以被访问控制关键字public、private、protected修饰

4.  类的方法

类中定义的函数称之为方法,可以受访问控制关键字public、private、protected修饰

也可以被static修饰,称为静态方法,通过类名和双冒号::直接访问。

class Car{    var $name ='汽车';    public static function getName(){        return $this->name;    }}echo Car::getName();
5. 构造函数与析构函数

class pCar{    function __construct(){        print "父类的构造函数";    }}class Car extends pCar{    var $name ='汽车';    function __construct(){        print "构造函数\n";        parent::__construct();    }    function __destruct(){        print "析构函数\n";    }    public static function getName(){        return $this->name;    }}$car=new Car(); //此时调用构造函数unset($car);   //此时调用析构函数,PHP代码执行完毕后会自动回收和销毁对象,一般不需要显示调用unset
6. static静态关键字

用类名::方法名的方式调用。在静态方法中,不允许使用$this,可以使用self、parent。static在内部调用静态方法与属性。

class pCar{    public static $speed=10;    public static function start(){        return self::$speed;    }}class Car extends pCar{    public static function getSpeed(){        parent::start();    }}pCar::start();
7. 访问控制

  • 被定义为公有的类成员可以在任何地方被访问
  • 被定义为受保护的类成员可以被其自身以及其父类和子类访问
  • 被定义为私有的类成员只能被其定义所在的类访问
7.1 类属性必须定义访问控制类型,如被定义为var则表示公有类型(为了兼容PHP5以前的版本)
7.2 类方法的访问控制类型省略时表示公有
7.3 如果构造函数定义为私有方法,则不允许直接实例化对象,这时候一般通过静态方法进行实例化。在设计模式中经常使用这样的方法控制对象的创建,比如单例模式只允许有一个全局唯一的对象。
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. 对象继承
extends关键字
9. 重载
PHP的重载指动态地创建类属性和方法,是通过魔法方法(以两个下滑线开头的方法)实现的。当调用当前环境下未定义或不可见的类属性或方法时,重载方法会被调用。
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){        return isset($this->ary[$key]);      }    public function __unset($key){        unset($this->ary[$key]);    }}$car=new Car();$car->name='汽车';    //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(); 
10. 高级特性
10.1 对象比较
当同一个类的两个实例的所有属性都相等时,比较运算符==判断为true
当两个变量为同一个对象的引用时,比较运算符判断符===判断为true
10.2 对象复制
通过关键字clone复制对象,这时__clone()方法被调用
$a=new Car();$a->name='new car';$b=clone $a;
10.3 对象序列化
可以用serialize方法将对象序列化为字符串,用于存储或者传递数据,然后在需要的时候通过unserialize将字符串反序列化为对象进行使用。
$a=new Car();$str=serialize($a);$b=unserialize($str);