通常一提到 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);
}
}