//construct 

  //构造函数 在一个类中定义一个方法作为构造函数。具有构造函数的类会在每次创建新对象时先调用此方法。如果子类中定义了构造函数则不会隐式调用其父类的构造函数。要执行父类的构造函数,需要在子类的构造函数中调用 parent::
construct() 。如果子类没有定义构造函数则会如同一个普通的类方法一样从父类继承(假如没有被定义为 private 的话)。 

  class Animal{

    public function construct() {

    $this->created = time();

    $this->logfile_handle = fopen('/tmp/log.txt', 'w');

    }

  }



  class Penguin extends Animal {

  }

  $tux = new Penguin;

  echo $tux->created;



  //destruct 

  //析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行。

  //和构造函数一样,父类的析构函数不会被引擎暗中调用。要执行父类的析构函数,必须在子类的析构函数体中显式调用 parent::
destruct() 。此外也和构造函数一样,子类如果自己没有定义析构函数则会继承父类的。 

  //析构函数即使在使用 exit()  终止脚本运行时也会被调用。在析构函数中调用 exit()  将会中止其余关闭操作的运行。

  class Animal{

    public function __construct() {

      $this->created = time();

      $this->logfile_handle = fopen('/tmp/log.txt', 'w');

    }

    public function
destruct() {

      fclose($this->logfile_handle);

    }

  }



  //get

  //读取不可访问属性的值时,
get() 会被调用。 

  //set

  //在给不可访问属性赋值时,
set() 会被调用。 

 class  PropertyTest  {

    /  被重载的数据保存在此  */

    private  $data  = array();

    /*  重载不能被用在已经定义的属性  /

    public  $declared  =  1 ;

    /
 只有从类外部访问这个属性时,重载才会发生 */

    private  $hidden  =  2 ;

    public function  set ( $name ,  $value ){

        echo  "Setting ' $name ' to ' $value '\n" ;

        $this -> data [ $name ] =  $value ;

    }

    public function  
get ( $name ) {

      echo  "Getting ' $name '\n" ;

      if ( array_key_exists ( $name ,  $this -> data )) {

        return  $this -> data [ $name ];

      }

      $trace  =  debug_backtrace ();

        trigger_error (

             'Undefined property via get(): '  .  $name  .

             ' in '  .  $trace [ 0 ][ 'file' ] .

             ' on line '  .  $trace [ 0 ][ 'line' ],

             E_USER_NOTICE );

        return  null ;

    }

  }

  $obj  = new  PropertyTest ;

  $obj -> a  =  1 ;

  echo  $obj -> a  .  "\n\n" ;



  //
call

  //在对象中调用一个不可访问方法时,call() 会被调用。 

  //用静态方式中调用一个不可访问方法时,
callStatic() 会被调用。 



  class  MethodTest {

    public function  call ( $name ,  $arguments ) {

      // 注意: $name 的值区分大小写

      echo  "Calling object method ' $name ' ".  implode ( ', ' ,  $arguments ).  "\n" ;

    }

     /*  PHP 5.3.0之后版本  /

    public static function  
callStatic ( $name ,  $arguments ) {

      // 注意: $name 的值区分大小写

      echo  "Calling static method ' $name ' ".  implode ( ', ' ,  $arguments ).  "\n" ;

    }

  }

  $obj  = new  MethodTest ;

  $obj -> runTest ( 'in object context' );

  MethodTest :: runTest ( 'in static context' );   // PHP 5.3.0之后版本







  //sleep

  //
sleep()方法会被调用当对象被序列化后,并允许你处理序列化。这有各种各样的程序,一个很好的例子如果一个对象包含某种类型的指针,例如文件句柄或引用另一个对象。当对象被序列化然后解序列化,这些引用类型是无用的,因为这些类型的引用的目标可能不再存在或有效。因此,最好是来取消这些信息在存储它们之前。



  //wakeup

  //wakeup()是与
sleep()方法相反的,允许您更改对象解序列化的行为。和sleep()一起使用,可以用来恢复被删除的句柄和对象当对象被序列化时。一个很好的例子程序是数据库句柄被取消设置当该项被序列化,然后恢复到当前配置中设置项目时,解序列化一个数据库句柄。



  //
clone

  //我们看过一个使用clone关键字的例子,在我的介绍从入门到oop的第二部分,创建对象的副本,而不是有两个变量指向同一个实际的数据。在一个类中重写此方法,我们可以观察发生了什么当在对象上使用clone关键字时,。虽然这是不是我们每一天能遇到的,一个漂亮的用例是创建一个真正的单例模式通过添加private访问修饰符给这个方法。



  //toString

  //
toString() 方法用于一个类被当成字符串时应怎样回应。例如 echo $obj; 应该显示些什么。此方法必须返回一个字符串,否则将发出一条 E_RECOVERABLE_ERROR  级别的致命错误。 

  // Declare a simple class

  class  TestClass{

    public  $foo ;

    public function  construct ($foo) {

      $this -> foo  =  $foo ;

    }

    public function  
toString () {

      return  $this -> foo ;

    }

  }



  $class  = new  TestClass ( 'Hello' );

  echo  $class ;



ps:参考地址:

http://php.net/manual/zh/language.oop5.magic.php

http://www.oschina.net/translate/9-magic-methods-in-php?print