美文网首页
PHP开发面向对象考点

PHP开发面向对象考点

作者: 一位先生_ | 来源:发表于2021-10-12 15:27 被阅读0次

    PHP 魔术方法和触发场景:

    __tostring()方法是在对象当作字符串输出时被自动调用   __invoke()方法是在对象当作方法时被自动调用

    ```

    <?php

    class Tomato{

    public function __tostring()

    {

    return"string";    

     }

    public function __invoke()

    {

    echo"invoke";    

     }

    }  

    $tomato = new Tomato();

    echo $tomato;//对象当作字符串输出

    $tomato();//对象当作方法

    ```

    __call(),__callStatic()

    __call()实现对方法的重载  __callStatic()实现对静态方法的重载 - implode()等价于spilt()方法

    <?php

    class Tomato {

    public function __call($name, $arguments)

    {

    echo'$name:'.$name.'$arguments:'.implode(", ", $arguments);    

     }

    public static function __callStatic($name, $arguments)

    {

    echo'$name:'.$name.'$arguments:'.implode(", ", $arguments);    

     } 

     }

     $tomato->runSet("Allo","Bllo");//类内部没有该方法,是通过__call()重载实现的

    Tomato::deRunSet("Cllo","Dllo");//类内部没有该静态方法,是通过__callStatic()重载实现的

    ?>

    ```

    __get(),__set()__isset(),__unset(),__empty()

    - 获取对象属性时__get()被自动调用,一般用于获取私有属性 - 设置对象属性时__set()被自动调用 - isset判断是否存在该属性,empty相反 - 释放变量时__unset(),被自动调用

    <?php

    class Tomato {

    private $name ="火星情报局";

    public function __get($name)

    {

    //参数为属性名

    if(isset($name)){ //isset判断是否存在该属性,与empty相反echo"存在";

    echo$this->name;          

    }else{

    return null;          

    }    

     }

    public function __set($name, $value){

    //参数为 属性名、属性值

    echo $this->$name = $value;//设置属性

    }

    public function __unset($name){

    //释放属性变量时,被自动调用

    echo"null";   

     } 

    $tomato->name;//获取元素属性

    $tomato->name ="提莫队长";//设置元素属性

    unset($tomato->name);//释放变量

    ?>

    ```

    __clone()

    __clone(),在对象被克隆时调用 - 克隆后的对象具有与原对象相同的所有属性、方法 - 克隆后的对象属性的改变不影响原对象,即互不影响 __clone()方法内部可以设置哪些属性不必克隆,用自己设置即可

    <?php

    class Tomato {

    private $name ="火星情报局";

    private $title ="沈梦晨";

    private $data ="2016";

    public function __clone()

    {

    echo $this->name ="老坛酸菜";

    //该属性不必克隆,用自己设置的

    $tomato2 =clone$tomato;//克隆对象

    $tomato2->data="2017";//通过克隆对象该变属性

    $tomato->name;//获取原对象属性

    $tomato->title;//原对象属性

    $tomato->data;//获取原对象属性,发现没有改变

    $tomato2->name;//获取现对象属性

    $tomato2->title;//克隆对象属性,与原对象不一样

    $tomato2->data;//获取克隆对象属性,发现改变

    ?>

    ```

    综上,克隆后的对象属性的改变不影响原对象

    克隆的过程中,可以自己设置自己的值,没必要完全克隆(根据实际情况)

    PHP设计模式:

    工厂模式

    单例模式

    注册数模式

    适配器模式

    观察者模式

    策略模式

    相关文章

      网友评论

          本文标题:PHP开发面向对象考点

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