PHP 构造函数的用途

2022-08-30 09:58:15

我正在使用类和对象类结构,但不是在复杂的级别上 - 只是类和函数,然后在一个地方,实例化。

至于 和 ,请非常简单地告诉我:构造函数和析构函数的目的是什么__construct__destruct

我知道学校层面的理论解释,但我期待像在现实世界中一样的东西,就像我们必须在哪些情况下使用它们一样。

请也提供一个例子。

问候


答案 1

构造函数是在对象初始化(分配其内存,复制实例属性等)后执行的函数。其目的是将对象置于有效状态。

通常,要处于可用状态的对象需要一些数据。构造函数的目的是强制在实例化时将此数据提供给对象,并禁止任何没有此类数据的实例。

考虑一个封装字符串的简单类,该类具有返回此字符串长度的方法。一种可能的实现是:

class StringWrapper {
    private $str;

    public function setInnerString($str) {
        $this->str = (string) $str;
    }

    public function getLength() {
        if ($this->str === null)
            throw new RuntimeException("Invalid state.");
        return strlen($this->str);
    }
}

为了处于有效状态,需要在 之前调用此函数。通过使用构造函数,可以强制所有实例在调用时处于良好状态:setInnerStringgetLengthgetLength

class StringWrapper {
    private $str;

    public function __construct($str) {
        $this->str = (string) $str;
    }

    public function getLength() {
        return strlen($this->str);
    }
}

您还可以保留 以允许在实例化后更改字符串。setInnerString

当对象即将从内存中释放时,将调用析构函数。通常,它包含清理代码(例如,关闭对象正在保存的文件描述符)。它们在PHP中很少见,因为当脚本执行结束时,PHP会清除脚本持有的所有资源。


答案 2

通过示例学习:

class Person {
  public $name;
  public $surname;
  public function __construct($name,$surname){
    $this->name=$name;
    $this->surname=$surname;
  }
}

为什么这有帮助?因为不是:

$person = new Person();
$person->name='Christian';
$person->surname='Sciberras';

您可以使用:

$person = new Person('Christian','Sciberras');

这是更少的代码,看起来更干净!

注意:正如下面的回复正确指出的那样,构造函数/析构函数用于各种各样的事情,包括:变量的取消/初始化(特别是当值是可变的时),内存解除/分配,不变量(可能被超越)和更清晰的代码。我还想指出,“更干净的代码”不仅仅是“糖”,而是增强了可读性,可维护性等。


推荐