• PHP面向对象——构造函数、析构函数


    在PHP中构造函数和析构函数是固定的,如下:

    复制代码
    // 构造函数
    function __construct([argument1,argument2,...,argumentN]){
        /* Class initialization code */
    }
    
    // 析构函数
    function __destruct(){
        // ...
    }
    复制代码
    构造函数
    • 构造函数可以接受参数,能够在创建对象时赋值给对象属性
    • 构造函数可以调用类方法或其他函数
    • 构造函数可以调用其他类的构造函数

        构造函数使用例子:

    复制代码
    <?php
    class Person{
        private $name;
        private $age;
        private $gender;
    
        public function __construct($name,$age,$gender){
            $this->setName($name);
            $this->setAge($age);
            $this->setGender($gender);
        }
    
        public function setName($name){
            $this->name = $name;
        }
    
        // ... getter setter 方法
    
    }
    
    $peron = new Person("lee",18,'男');
    
    ?>
    复制代码

        调用父类构造函数、调用无关类的构造函数:

    function __construct(){
        parent::__construct(); // 调用父类的构造函数必须显示的使用parent调用父类构造函数
        classname::__construct(); // 调用其他类的构造函数,classname是类名
        //其他操作
    }
    继承和构造函数

        PHP中的子类的构造函数不会主动调用父类的构造函数,要显示的使用parent::__construct()调用:

    复制代码
    <?php
    class Animal{
        private $name;
        function __construct($name){
            $this->setName($name)
            echo "动物类被创建!";
        }
        // ... 其他方法
    
    }
    
    class Birds extends Animal{
        private $name;
        private $leg;
        function __construct($name,$leg){
            parent::__construct($name); // 显示调用
            $this->setLeg($leg);
            echo "鸟类被创建!";
        }
        // ... 其他方法
    }
    ?>
    复制代码

        如果涉及多层继承,当调用parent::__construct()时,会沿着父类向上搜索,直到找到最合适的构造函数,例如:

    复制代码
    // 接上例
    
    class Parrot extends Birds{
        private $name;
        private $leg;
        private $wing;
        function __construct($name){
            parent::__construct($name); // 此时没有找到父类(Birds类)合适的构造函数,只能向上搜索,搜索到Animal类时,才找到合适的构造函数
            echo "鹦鹉类被创建!";
            $this->smackTalk();
            /*
            输出结果:
            "动物类被创建!"
            "鹦鹉说话!"
            */
        }
        function smackTalk(){
            echo "鹦鹉说话!";    
        }
    
    }
    复制代码

        如果想要依次调用几个父类的构造函数,可以使用类名直接调用构造函数,例如:

    function __construct($name,$leg){
           Animal::__construct($name); // 调用Animal构造函数
            Birds::__construct($name,$leg); // 调用Birds构造函数
    }

       PHP是不支持函数的重载,所有构造函数同样不能有多个。

    析构函数
    • 析构函数是在销毁对象时,自动调用,不能显示的调用。
    • 析构函数不能带参数。

    在以下几种情况下可能会调用析构函数(但不一定):

    • PHP页面加载完毕之后;
    • unset()类;
    • 变量引用指向别的对象或值时;

    PHP的内存回收机制和JAVA的很类似,对没有任何引用的对象进行销毁回收,采用引用计数器的技术。

    例子:

    复制代码
    <?php
    class test{
        function __destruct(){
            echo "当对象销毁时会调用!!!";
        }
    
    }
    $a = $b = $c = new test();
    
    $a = null;
    unset($b);
    
    echo "<hr />";
    
    ?>
    复制代码

    此例子,如下图,有三个变量引用$a,$b,$c指向test对象,test对象就有3个引用计数,当$a = null时,$a对test对象的引用丢失,计数-1,变为2,当$b被unset()时,$b对test对象的引用也丢失了,计数再-1,变为1,最后页面加载完毕,$c指向test对象的引用自动被释放,此时计数再-1,变为0,test对象已没有变量引用,就会被销毁,此时就会调用析构函数。

    image

  • 相关阅读:
    《算法竞赛进阶指南》0x12 队列 POJ2259 Team Queue
    《算法竞赛进阶指南》0x11栈 单调栈求矩形面积 POJ2559
    《算法竞赛进阶指南》0x11 栈 求解中缀表达式
    19.职责链模式(Chain of Responsibility Pattern)
    16.观察者模式(Observer Pattern)
    17.解释器模式(Interpreter Pattern)
    15. 迭代器模式(Iterator Pattern)
    14.命令模式(Command Pattern)
    12.代理模式(Proxy Pattern)
    13.模板方法(Template Method)
  • 原文地址:https://www.cnblogs.com/xiaoleiel/p/8324199.html
Copyright © 2020-2023  润新知