当前位置:首页 > PHP教程 > php面向对象 > 列表

PHP类中的魔术方法(Magic Method)简明总结

发布:smiling 来源: PHP粉丝网  添加日期:2021-03-14 14:25:08 浏览: 评论:0 

这篇文章主要介绍了PHP类中的魔术方法(Magic Method)简明总结,这些方法包括__construct()、__destruct()、__call()、__callStatic()、__get()、__set()、__toString()等,需要的朋友可以参考下

1. __construct()和__destruct()

在实例被 创建/销毁 的时候被调用,都可以传递0个或多个参数。

  1. class A 
  2.  { 
  3.   function A() 
  4.   { 
  5.    echo "build A"
  6.   } 
  7.  
  8.   function __destruct() 
  9.   { 
  10.    echo "destroy A"
  11.   } 
  12.  } 
  13.  
  14.  $obj = new A(); 
  15.  //unset($obj); 
  16. Note:The destructor method will be called as soon as there are no other references to a particular object, or in any order during the shutdown sequence. 

关于构造函数,PHP5.3.3开始,一个定义在某个特定的命名空间里的class中以类名命名的方法将不再被认为是构造函数。在无命名空间的类中与原来一样依旧是构造函数。如:

  1. namespace Foo; 
  2. class Bar { 
  3.   public function Bar() { 
  4.     // treated as constructor in PHP 5.3.0-5.3.2 
  5.     // treated as regular method as of PHP 5.3.3 
  6.   } 

如果没有namespace Foo; 那么Bar()还将被当作构造函数。另外,如果存在下面的情况:

  1. function __construct() 
  2.   { 
  3.    echo "construct A"
  4.   } 
  5.  
  6.   function A() 
  7.   { 
  8.    echo "build A"
  9.   } 
  10.  
  11.   function __destruct() 
  12.   { 
  13.    echo "destroy A"
  14.   } 
  15.  } 

即既包含__construct()又包含与类名同名的函数,那么将只调用__construct()。

2. __call()和__callStatic()

当尝试调用一个不存在的方法时调用该方法。两个参数,一个是方法名,一个是被调用方法的参数数组。

  1. class MethodTest 
  2.   public function __call($name$arguments
  3.   { 
  4.     // Note: value of $name is case sensitive. 
  5.     echo "Calling object method '$name' " 
  6.        . implode(' '$arguments). "<br>"
  7.   } 
  8.  
  9.   public static function __callStatic($name$arguments
  10.   { 
  11.     // Note: value of $name is case sensitive. 
  12.     echo "Calling static method '$name' " 
  13.        . implode(' '$arguments). "<br>"
  14.   } 
  15.  
  16. $obj = new MethodTest; 
  17. $obj->runTest('in','object','context'); 
  18. MethodTest::runTest('in','static','context'); 

其中,$arguments作为一个array传入。运行结果:

Calling object method 'runTest' in object context

Calling static method 'runTest' in static context

还要注意函数的作用域protected和private:

  1. class TestMagicCallMethod { 
  2.   public function foo() 
  3.   { 
  4.     echo __METHOD__.PHP_EOL."<br>"
  5.   } 
  6.  
  7.   public function __call($method$args
  8.   { 
  9.     echo __METHOD__.PHP_EOL."<br>"
  10.     if(method_exists($this$method)) 
  11.     { 
  12.       $this->$method(); 
  13.     } 
  14.   } 
  15.     
  16.   protected function bar() 
  17.   { 
  18.     echo __METHOD__.PHP_EOL."<br>"
  19.   } 
  20.  
  21.   private function baz() 
  22.   { 
  23.     echo __METHOD__.PHP_EOL."<br>"
  24.   } 
  25.  
  26. $test  =  new TestMagicCallMethod(); 
  27. $test->foo(); 
  28. /** 
  29.  * Outputs: 
  30.  * TestMagicCallMethod::foo 
  31.  */ 
  32.  
  33. $test->bar(); 
  34. /** 
  35.  * Outputs: 
  36.  * TestMagicCallMethod::__call 
  37.  * TestMagicCallMethod::bar 
  38.  */ 
  39.  
  40. $test->baz(); 
  41. /** 
  42.  * Outputs: 
  43.  * TestMagicCallMethod::__call 
  44.  * TestMagicCallMethod::baz 
  45.  */ 

3.__get()和__set()

当试图读取一个对象并不存在的属性的时候被调用。

Note:我们可以用这个函数实现类似java中反射的各种操作。

  1. class Test 
  2.   public function __get($key
  3.   { 
  4.    echo $key . " not exists"
  5.   } 
  6.   public function __set($key,$value
  7.   { 
  8.    echo $key . " = ".$value
  9.   } 
  10.  
  11. $t = new Test(); 
  12. echo $t->name."<br>"
  13. $t->name = "abc"
  14. 输出: 
  15. name not exists 
  16. name = abc 

4. __toString()

这个方法类似于java的toString()方法,当我们直接打印对象的时候回调用这个函数,函数必须返回一个string。

  1. class Test 
  2.   private $name = "abc"
  3.   private $age = 12; 
  4.  
  5.   public function __toString() 
  6.   { 
  7.     return "name : $this->name, age : $this->age"
  8.   } 
  9.  
  10. $t = new Test(); 
  11. echo $t
  12. 输出: 
  13. name : abc, age : 12 

Tags: PHP魔术方法

分享到: