01
class
Animal{
02
03
public
function
__construct() {
04
$this
->created = time();
05
$this
->logfile_handle =
fopen
('/tmp/log.txt', 'w');
06
}
07
08
public
function
__destruct() {
09
fclose(
$this
->logfile_handle);
10
}
11
}
析构器让我们关闭任何额外的资源比如被使用过的对象。在
php 中由于我们有这样运行时间
短的脚本(留意在更新的
php 版本中增强的垃圾回收机制),通常讨论内存溢出根本不需
要。然而它仍是好的推行方法来清理而且总体上让程序运行起来更高效。
__get
这个魔术方法是一个非常灵巧的小技巧
- 它使实际上不存在的属性如同存在一半。让我们举
个小企鹅的例子:
01
class
Penguin
extends
Animal {
02
03
public
function
__construct(
$id
) {
04
$this
->getPenguinFromDb(
$id
);
05
}
06
07
public
function
getPenguinFromDb(
$id
) {
08
// elegant and robust database code goes here
09
}
10
}
现在,如果我们的小企鹅有一个
"name" 属性,而在此之后加载的属性为 "age",那么我们
可以这样处理:
1
$tux
=
new
Penguin(3);
2
echo
$tux
->name . " is " .
$tux
->age . " years old\n";
然而,设想一下,后端数据库或数据供应者发生了改变,
"name"没有了,变味
了
"username"。并且设想这是一个非常复杂的应用,而需要修改的调用"name"的地方非常多。
我们可以使用
__get 方法,使得"name"属性如同存在一样:
01
class
Penguin
extends
Animal {
02
03
public
function
__construct(
$id
) {
04
$this
->getPenguinFromDb(
$id
);
05
}
06
07
public
function
getPenguinFromDb(
$id
) {
08
// elegant and robust database code goes here
09
}
10