我正在处理类和对象类结构,但不是在一个复杂的层次上--仅仅是类和函数,然后在一个地方实例化。
关于__construct
和__destruct
,请非常简单地告诉我:构造函数和析构函数的用途是什么
我知道学校层面的理论解释,但我希望在现实世界中会有一些东西,比如在哪些情况下我们必须使用它们。
请同时提供一个例子。
问候
发布于 2010-06-13 23:48:09
构造函数是在对象初始化(分配内存、复制实例属性等)后执行的函数。其目的是将对象置于有效状态。
通常,处于可用状态的对象需要一些数据。构造函数的目的是在实例化时强制将此数据提供给对象,并禁止任何没有此类数据的实例。
假设有一个简单的类,它封装了一个字符串,并且有一个返回该字符串长度的方法。一种可能的实现是:
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);
}
}
为了处于有效状态,此函数要求在getLength
之前调用setInnerString
。通过使用构造函数,您可以在调用getLength
时强制所有实例处于良好状态:
class StringWrapper {
private $str;
public function __construct($str) {
$this->str = (string) $str;
}
public function getLength() {
return strlen($this->str);
}
}
您还可以保留setInnerString
,以允许字符串在实例化后更改。
当对象即将从内存中释放时,将调用析构函数。通常,它包含清理代码(例如,关闭对象持有的文件描述符)。这在PHP中很少见,因为PHP会在脚本执行结束时清除脚本持有的所有资源。
发布于 2010-06-13 23:54:23
举一反三:
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');
这样的代码更少,看起来更整洁!
注意:正如下面的回复正确声明的那样,构造函数/析构函数用于各种各样的事情,包括:变量的解/初始化(特别是当值为变量时)、内存解/分配、不变量(可以被超越)和更干净的代码。我还想指出的是,“更干净的代码”不仅仅是“糖”,它还增强了可读性、可维护性等。
发布于 2010-06-14 00:13:23
构造函数在您实例化类的实例时运行。所以如果你有一个Person
类
class Person {
public $name = 'Bob'; // this is initialization
public $age;
public function __construct($name = '') {
if (!empty($name)) {
$this->name = $name;
}
}
public function introduce() {
echo "I'm {$this->name} and I'm {$this->age} years old\n";
}
public function __destruct() {
echo "Bye for now\n";
}
}
要演示,请执行以下操作:
$person = new Person;
$person->age = 20;
$person->introduce();
// I'm Bob and I'm 20 years old
// Bye for now
我们可以通过构造函数参数覆盖初始化设置的默认值:
$person = new Person('Fred');
$person->age = 20;
$person->introduce();
// if there are no other references to $person and
// unset($person) is called, the script ends
// or exit() is called __destruct() runs
unset($person);
// I'm Fred and I'm 20 years old
// Bye for now
希望这有助于演示构造函数和析构函数在哪里被调用,它们有什么用?
__construct()
可以将类成员默认为具有资源或更复杂的数据structures.__destruct()
可以释放诸如文件和数据库句柄之类的资源。构造函数https://stackoverflow.com/questions/3032808
复制相似问题