php构造方法与析构方法

php中
“方法”也叫做“函数”
“访问”也叫做“调用”

构造方法也称之为“构造函”
构析方法也称之为“构析函数”

构造方法的定义与调用

<?php
header("Content-type:text/html;charset=utf-8");

class Girl1{
    function __construct(){
        echo "一个绝世MM诞生了!<br>";  //定义一个无参数的构造方法
    }
}

class Girl2{
    public $name;

    function __construct($name){  //定义一个带有参数的构造方法
        $this->name = $name;
        echo '一个叫'.$this->name.'MM诞生了!<br>';
    }
}

$g1 = new Girl1();  //实例化类,调用无参数的构造方法
$g2 = new Girl2('沫沫');  //实例化类,调用带有参数的构造方法

?>

如果类中没有定义构造方法,PHP引擎会自动给类添加一个构造方法,其参数列表为空,方法内容也为空。

析构方法

析构方法在类的实例化被销毁时自动调用,且没有参数。

function __destruct(){
//...
}

调用父类的构造方法和析构方法

  • 如果子类中没有定义构造方法,而父类中定义了构造方法,则子类实例化时会自动调用父类的构造方法

  • 如果在子类中定义了构造方法,则在子类实例化是不会自动调用父类的构造方法

  • 如果子类中没有定义析构方法,则子类的实例在被销毁时会自动调用父类的析构方法

  • 如果在子类中定义了析构方法,则在子类的实例被销毁时不会自动调用父类的析构方法

在子类中调用父类的构造方法和析构方法,需要按如下语法格式显式调用:

//----------显式调用父类的构造方法----------
function __construct(){
//...
parent::__construct();
//...
}

//---------显式调用父类的析构方法--------------
function __destruct(){
//...
parent::__destruct();
//...
}

之所以被称为“显式”,是因为若子类中没有定义构造方法和析构方法,当子类的实例化对象销毁时父类的构造方法和析构方法会被自动调用;而在子类中定义了构造方法和析构方法时,父类的构造方法和析构方法不会被自动调用,所以需要明确的提出需要调用父类的构造方法和析构方法。
(也可以看作子类没有定义构造方法和析构方法时,会自动调用父类的构造方法和析构方法,可以省略调用的语句。)

<?php
header("Content-type:text/html;charset=utf-8");

echo '<br>------显式调用父类的构造方法和析构方法------<br>';
    /*
        父类
    */
    class People{
        public $name;  //公有属性
        private $age;  //私有属性
        //父类的构造方法
        function __construct($name,$age){
            $this->name = $name;
            $this->age = $age;
        }
        public function Introduce(){  //公有方法
            echo '我叫'.$this->name.',年芳'.$this->age.'<br>';  //在类内部的方法中访问该类的成员属性
        }
        //父类的析构方法
        function __destruct(){
            echo '父类的析构方法被调用<br>';
        }
    }
    /*
        子类
    */
    class Student extends People{  //定义一个叫Student的类并继承People类所具有的属性和方法
        public $school;  //公有属性
        function __construct($name,$age,$school){
            //显式调用父类的构造方法
            parent::__construct($name,$age);
            $this->school = $school;
        }
        public function getSchool(){  //公有方法
            echo '本府毕业于'.$this->school.'<br>';  //在类内部的方法中访问该类的成员属性
        }
        function __destruct(){
            echo '子类的析构方法被调用<br>';
            //显式调用父类的析构方法
            parent::__destruct();
        }
    }
    $s = new Student('沫沫',20,'庐山皇家学院');  //实例化子类
    echo '本府行不更名坐不改姓,'.$s->name.'是也!<br>';  //调用继承自父类的属性
    $s->Introduce();  //调用继承自父类的方法
    $s->getSchool();  //调用子类的方法
    //$s被销毁,默认调用子类的析构方法
?>
(0)

相关推荐