PHP面对对象

  • − 定义了一件事物的抽象特点。类的定义包含了数据的形式以及对数据的操作。

  • 对象 − 是类的实例。

  • 成员变量 − 定义在类内部的变量。该变量的值对外是不可见的,但是可以通过成员函数访问,在类被实例化为对象后,该变量即可称为对象的属性。

  • 成员函数 − 定义在类的内部,可用于访问对象的数据。

  • 继承 − 继承性是子类自动共享父类数据结构和方法的机制,这是类之间的一种关系。在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并加入若干新的内容。

  • 父类 − 一个类被其他类继承,可将该类称为父类,或基类,或超类。

  • 子类 − 一个类继承其他类称为子类,也可称为派生类。

  • 多态 − 多态性是指相同的函数或方法可作用于多种类型的对象上并获得不同的结果。不同的对象,收到同一消息可以产生不同的结果,这种现象称为多态性。

  • 重载 − 简单说,就是函数或者方法有同样的名称,但是参数列表不相同的情形,这样的同名不同参数的函数或者方法之间,互相称之为重载函数或者方法。

  • 抽象性 − 抽象性是指将具有一致的数据结构(属性)和行为(操作)的对象抽象成类。一个类就是这样一种抽象,它反映了与应用有关的重要性质,而忽略其他一些无关内容。任何类的划分都是主观的,但必须与具体的应用有关。

  • 封装 − 封装是指将现实世界中存在的某个客体的属性与行为绑定在一起,并放置在一个逻辑单元内。

  • 构造函数 − 主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。

  • 析构函数 − 析构函数(destructor) 与构造函数相反,当对象结束其生命周期时(例如对象所在的函数已调用完毕),系统自动执行析构函数。析构函数往往用来做"清理善后" 的工作(例如在建立对象时用new开辟了一片内存空间,应在退出前在析构函数中用delete释放)。

  • 魔法函数

    ​ __construct(),类的构造函数,对象创建时调用

    ​ __destruct(),类的析构函数,对象消亡时调用

    ​ __call(),在对象中调用一个不可访问方法时调用

    ​ __callStatic(),用静态方式中调用一个不可访问方法时调用

    ​ __get(),获得一个类的成员变量时调用

    ​ __set(),设置一个类的成员变量时调用

    ​ __isset(),当对不可访问属性调用isset()或empty()时调用

    ​ __unset(),当对不可访问属性调用unset()时被调用。

    ​ __sleep(),执行serialize()时,先会调用这个函数

    ​ __wakeup(),执行unserialize()时,先会调用这个函数

    ​ __toString(),类被当成字符串时的回应方法

    ​ __invoke(),调用函数的方式调用一个对象时的回应方法

    ​ __clone(),当对象复制完成时调用

  • __construct();和__destruct();

<?php
class test{
    public function __construct(){
        echo 'creat a materializtion of the'.__CLASS__.'class'.PHP_EOL;
    }
    public function __destruct(){
        echo 'destroying '.__CLASS__.PHP_EOL;
    }
}
class children1 extends test{
    function __construct(){
        parent::__construct();
        echo 'creat a materializtion of the'.__CLASS__.'class'.PHP_EOL;
    }
    function __destruct(){
        parent::__destruct();
        echo 'destroying '.__CLASS__.PHP_EOL;
    }
class children2 extends test{}
}
$obj = new test(); // test类创建; PHP_EOL为换行符
//creat a materializtion of test class
//destroying test
$obj = new children1(); // chilren1类创建,其中parent::__construct()是继承父类的构造函数 destruct()也是一样
//creat a materializtion of test class
//creat a materializtion of thechildren1 class
//destroying test
//destroying children1
$obj = new chilren2(); // chilren2类创建,没有构造函数,会继承父类的构造函数
//creat a materializtion of test class
//destroying test
?>
  • __toString()
<?php
class test{
    public function __toString(){
        echo 'this is __toString cell';
    }
}
$obj = new test();//test类实例化 obj对象的创建
echo $obj;//将对象当作字符串打印回触发__toSting()方法
//output:this is this is __toString cell
?>  
  • __call()和__callStatic()
<?php
class test{
    public function __call($name ,$arguments){
        echo 'Object '.$name.' is not found'.implode(',',$arguments).PHP_EOL;//implode函数是将传入的数组参数合并到一起并用 ‘,’隔开。
    }
    public function __callStatic($name, $arguments){
        echo 'Static '.$name.' is not found'.implode(',',$arguments).PHP_EOL;
    }
}
$obj = new test;
$obj -> methodisnot(' __call');// Object methodisnot is not found __call
test::methodisnot('in __callStatic') //Static methodisnot is not found __callStatic
    //call callstatic 当对象没有该方法时,会重载 调用 这两个魔法函数
?>
  • get(),set(),isset() 和 unset()
<?php
class test{
    private $data = array(); //被重载的数据保存在此
    private $declared = 1; //重载时,被定义的属性不会被重载。 
    public function __get($name){
        echo "读取'$name'属性失败,可能不存在或被保护,__get()被调用".PHP_EOL;
    }
    public function __set($name,$value){//赋值时被调用
        echo "没有该属性,创建'$name',值:'$value'".PHP_EOL;
        $this->data['$name']=$value;
    }//在给不可访问(protected 或 private)或不存在的属性赋值时,__set() 会被调用。
    public function __isset($name){
        echo "'$name'属性不存在或无法访问,调用__isset()".PHP_EOL;
    }
    public function __unset($name){
        echo "'$name'属性受保护或者不存在,调用__unset()".PHP_EOL;
    }
}
$obj = new test;
$obj ->una = 1;
echo ($obj ->una);
isset($obj->una);
unset($obj->una);
?>
  • __sleep(),__wakeup(和__invoke()
<?php
class test{
    public $username;
    public $password;
    public function __sleep(){
        echo "调用serialize()函数,会触发__sleep()方法".PHP_EOL;
    }
    public function __wakeup(){
        echo "调用unserialize()函数,会触发__wakeup()方法".PHP_EOL;
    }
    public function __invoke(){
        echo "当对象被当作函数使用时,会调用__invoke".PHP_EOL;
    }
}
$obj = new test();
$obja = serialize($obj);
echo $obja.PHP_EOL;
$objb = unserialize($obja);
echo $objb.PHP_EOL;
$obj();
?>