魔术方法(一)__construct,__destruct

通常以__(两个下划线)开始,并且不需要显示的调用而是由某种特定的条件触发,具有某些特殊的功能和要求,新版本15个魔术方法。

一、构造函数 

1、__construct()

触发机制:使用关键字new实例化对象时会自动调用构造方法

参数:个数不限

作用:完成一些对象的初始化工作。常用的比如实现数据库自动连接。

将构造函数声明为私有方法,可以防止在类外部创建对象,这在单例模式中经常使用。

class Device {

   function  __construct(Battery $battery, $name) {

       $this->battery = $battery;

       $this->name = $name;

    }

}

2、如果子类中定义了构造函数则不会隐式调用其父类的构造函数。要执行父类的构造函数,需要在子类的构造函数中调用parent::__construct()。如果子类没有定义构造函数则会如同一个普通的类方法一样从父类继承(假如没有被定义为 private 的话)。

class BaseClass {
   function __construct() {
       print "In BaseClass constructor\n";
   }
}

class SubClass extends BaseClass {
   function __construct() {
       parent::__construct();
       print "In SubClass constructor\n";
   }
}

class OtherSubClass extends BaseClass {
    // inherits BaseClass's constructor
}

// In BaseClass constructor
$obj = new BaseClass();

// In BaseClass constructor
// In SubClass constructor
$obj = new SubClass();

// In BaseClass constructor
$obj = new OtherSubClass();

二、析构方法

__desctruct()

触发机制:析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行。

参数:无

作用:一些收尾工作,比如关闭数据库连接

垃圾回收(销毁)机制:当对象的使用终止,系统自动释放(销毁),收回对象在堆中占用的内存空间。

对象被“销毁”是指不存在任何对该对象的引用,比如引用该对象的变量被删除(unset)、重新赋值或脚本执行结束。

而析构方法正是在垃圾回收程序回收对象之前调用的

销毁顺序:因为对象的引用都是存放在栈内存中的,由于栈的后进先出特点(想象进死胡同),最后创建的对象引用会被最先释放

class MyDestructableClass {

   function __construct() {
       print "In constructor\n";
       $this->name = "MyDestructableClass";
   }

   function __destruct() {
       print "Destroying " . $this->name . "\n";
   }
}

$obj = new MyDestructableClass();
/*
In constructor 
Destroying MyDestructableClass
*/

猜你喜欢

转载自blog.csdn.net/hrbsfdxzhq01/article/details/88871906