PHP 类的构造函数和析构函数
通常一提到 PHP 的构造函数和析构函数,就会想到两个单词 construct
和 destruct
,构造和解构。
在学习 PHP 的时候,了解到的构造函数和析构函数就是 __construct()
和 __destruct()
。以 __
开头的方法在 PHP 中称为魔术方法。
PHP 中的魔术方法
__construct()
, __destruct()
,__call()
, __callStatic()
, __get()
, __set()
, __isset()
, __unset()
, __sleep()
, __wakeup()
, __toString()
, __invoke()
, __set_state()
, __clone()
和 __debugInfo()
在一个类里这些方法名属于保留字段,除非是要使用魔术功能,否则不应该使用。
学习的时候就想到了 Java 中的构造函数定义方式,定义一个与类名相同的方法,这个方法就是类的构造方法。Java 中的是否存在析构方法不清楚,想来是没有的,因为 Java 有自己的回收机制,不需要代码层面定义。
PHP5 之前的版本中,与类名同名的方法也是可以作为构造函数。
为了实现向后兼容性,如果 PHP 5 在类中找不到 __construct() 函数并且也没有从父类继承一个的话,它就会尝试寻找旧式的构造函数,也就是和类同名的函数。因此唯一会产生兼容性问题的情况是:类中已有一个名为 __construct() 的方法却被用于其它用途时。
自 PHP 5.3.3 起,在命名空间中,与类名同名的方法不再作为构造函数。这一改变不影响不在命名空间中的类。
PHP 官方文档说明了这两种构造函数的定义和使用方法。至于为什么中途弃用同名构造函数,不得而知。因为现有的 PHP 版本都是 5 ~ 7,所以同名构造函数用的越来越少。
以下是我在图片上传类中找到一个适配各种版本 PHP 的构造函数写法:
class image {
...
function __construct($img){
...
}
function image($img) {
$this->__construct($img);
}
}