通常一提到 PHP 的构造函数和析构函数,就会想到两个单词 constructdestruct,构造和解构。

在学习 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.net

PHP 官方文档说明了这两种构造函数的定义和使用方法。至于为什么中途弃用同名构造函数,不得而知。因为现有的 PHP 版本都是 5 ~ 7,所以同名构造函数用的越来越少。

以下是我在图片上传类中找到一个适配各种版本 PHP 的构造函数写法:

class image {
    ...
    function __construct($img){
        ...
    }

    function image($img) {
        $this->__construct($img);
    }
}