该文章总结自PHP手册,关于魔术方法的方法重载以及属性重载,进行了比较详细的总结。
/**方法重载public mixed __call ( string $name , array $arguments )public static mixed __callStatic ( string $name , array $arguments )在对象中调用一个不可访问方法时,__call() 会被调用。 用静态方式中调用一个不可访问方法时,__callStatic() 会被调用。 $name 参数是要调用的方法名称。 $arguments 参数是一个枚举数组,包含着要传递给方法 $name 的参数。 **/<?phpclass 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' ); // 使用静态方式调用/*以上例程会输出:Calling object method 'runTest' in object contextCalling static method 'runTest' in static context**/方法重载
属性重载
/** 属性重载 public void __set ( string $name , mixed $value ) public mixed __get ( string $name ) public bool __isset ( string $name ) public void __unset ( string $name ) 在给不可访问属性赋值时,__set() 会被调用。 读取不可访问属性的值时,__get() 会被调用。 当对不可访问属性调用 isset() 或 empty() 时,__isset() 会被调用。 当对不可访问属性调用 unset() 时,__unset() 会被调用。 参数 $name 是指要操作的变量名称。__set() 方法的 $value 参数指定了 $name 变量的值。 */ 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 ; } /** PHP 5.1.0之后版本 */ public function __isset ( $name ) { echo "Is ' $name ' set?\n" ; return isset( $this -> data [ $name ]); } /** PHP 5.1.0之后版本 */ public function __unset ( $name ) { echo "Unsetting ' $name '\n" ; unset( $this -> data [ $name ]); } /** 非魔术方法 */ public function getHidden () { return $this -> hidden ; } } echo "<pre>\n" ; $obj = new PropertyTest ; $obj -> a = 1 ; echo $obj -> a . "\n\n" ; var_dump (isset( $obj -> a )); unset( $obj -> a ); var_dump (isset( $obj -> a )); echo "\n" ; echo $obj -> declared . "\n\n" ; echo "Let's experiment with the private property named 'hidden':\n" ; echo "Privates are visible inside the class, so __get() not used...\n" ; echo $obj -> getHidden () . "\n" ; echo "Privates not visible outside of class, so __get() is used...\n" ; echo $obj -> hidden . "\n" ; /* 以上例程会输出: Setting 'a' to '1' Getting 'a' 1Is 'a' set? bool(true) Unsetting 'a' Is 'a' set? bool(false)1Let's experiment with the private property named 'hidden': Privates are visible inside the class, so __get() not used... 2 Privates not visible outside of class, so __get() is used... Getting 'hidden'Notice: Undefined property via __get(): hidden in <file> on line 70 in <file> on line 29 */