background image

 

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