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

详解php魔术方法(Magic methods)的使用方法

发布:smiling 来源: PHP粉丝网  添加日期:2021-07-09 22:53:02 浏览: 评论:0 

有些东西如果不是经常使用,很容易忘记,比如魔术方法和魔术常量,这篇文章主要介绍了php魔术方法(Magic methods)的使用方法,感兴趣的小伙伴们可以参考一下。

PHP中把以两个下划线__开头的方法称为魔术方法,这些方法在PHP中充当了举足轻重的作用。 魔术方法包括:

__construct(),类的构造函数

__destruct(),类的析构函数

__call(),在对象中调用一个不可访问方法时调用

__callStatic(),用静态方式中调用一个不可访问方法时调用

__get(),获得一个类的成员变量时调用

__set(),设置一个类的成员变量时调用

__isset(),当对不可访问属性调用isset()或empty()时调用

__unset(),当对不可访问属性调用unset()时被调用。

__sleep(),执行serialize()时,先会调用这个函数

__wakeup(),执行unserialize()时,先会调用这个函数

__toString(),类被当成字符串时的回应方法

__invoke(),调用函数的方式调用一个对象时的回应方法

__set_state(),调用var_export()导出类时,此静态方法会被调用。

__clone(),当对象复制完成时调用

__construct()和__destruct()

构造函数和析构函数应该不陌生,他们在对象创建和消亡时被调用,例如我们需要打开一个文件,在对象创建时打开,对象消亡时关闭

  1. <?php  
  2. class FileRead 
  3.  protected $handle = NULL; 
  4.  
  5.  function __construct(){ 
  6.   $this->handle = fopen(...); 
  7.  } 
  8.  
  9.  function __destruct(){ 
  10.   fclose($this->handle); 
  11.  } 
  12. ?> 

这两个方法在继承时可以扩展,例如:

  1. <?php  
  2. class TmpFileRead extends FileRead 
  3.  function __construct(){ 
  4.   parent::__construct(); 
  5.  } 
  6.  
  7.  function __destruct(){ 
  8.   parent::__destruct(); 
  9.  } 
  10. ?> 
  11. __call()和__callStatic() 

在对象中调用一个不可访问方法时会调用这两个方法,后者为静态方法,这两个方法我们在可变方法(Variable functions)调用中可能会用到。

  1. <?php 
  2. class MethodTest  
  3.  public function __call ($name$arguments) { 
  4.   echo "Calling object method '$name' ". implode(', '$arguments). "\n"
  5.  } 
  6.  
  7.  public static function __callStatic ($name$arguments) { 
  8.   echo "Calling static method '$name' ". implode(', '$arguments). "\n"
  9.  } 
  10.  
  11. $obj = new MethodTest; 
  12. $obj->runTest('in object context'); 
  13. MethodTest::runTest('in static context'); 
  14. ?> 

__get(),__set(),__isset()和__unset()

当get/set一个类的成员变量时调用这两个函数,例如我们将对象变量保存在另外一个数组中,而不是对象本身的成员变量。

  1. <?php  
  2. class MethodTest 
  3.  private $data = array(); 
  4.  
  5.  public function __set($name$value){ 
  6.   $this->data[$name] = $value
  7.  } 
  8.  
  9.  public function __get($name){ 
  10.   if(array_key_exists($name$this->data)) 
  11.    return $this->data[$name]; 
  12.   return NULL; 
  13.  } 
  14.  
  15.  public function __isset($name){ 
  16.   return isset($this->data[$name]) 
  17.  } 
  18.  
  19.  public function unset($name){ 
  20.   unset($this->data[$name]); 
  21.  } 
  22. ?> 

__sleep()和__wakeup()

当我们在执行serialize()和unserialize()时,会先调用这两个函数,例如我们在序列化一个对象时,这个对象有一个数据库链接,想要在反序列化中恢复链接状态,则可以通过重构这两个函数来实现链接的恢复,例子如下:

  1. <?php 
  2. class Connection  
  3.  protected $link
  4.  private $server$username$password$db
  5.  
  6.  public function __construct($server$username$password$db
  7.  { 
  8.   $this->server = $server
  9.   $this->username = $username
  10.   $this->password = $password
  11.   $this->db = $db
  12.   $this->connect(); 
  13.  } 
  14.  
  15.  private function connect() 
  16.  { 
  17.   $this->link = mysql_connect($this->server, $this->username, $this->password); 
  18.   mysql_select_db($this->db, $this->link); 
  19.  } 
  20.  
  21.  public function __sleep() 
  22.  { 
  23.   return array('server''username''password''db'); 
  24.  } 
  25.  
  26.  public function __wakeup() 
  27.  { 
  28.   $this->connect(); 
  29.  } 
  30. ?> 

__toString()

对象当成字符串时的回应方法,例如使用echo $obj;来输出一个对象

  1. <?php 
  2. // Declare a simple class 
  3. class TestClass 
  4.  public function __toString() { 
  5.   return 'this is a object'
  6.  } 
  7.  
  8. $class = new TestClass(); 
  9. echo $class
  10. ?> 

这个方法只能返回字符串,而且不可以在这个方法中抛出异常,否则会出现致命错误。

__invoke()

调用函数的方式调用一个对象时的回应方法,如下:

  1. <?php 
  2. class CallableClass  
  3.  function __invoke() { 
  4.   echo 'this is a object'
  5.  } 
  6. $obj = new CallableClass; 
  7. var_dump(is_callable($obj)); 
  8. ?> 

__set_state()

调用var_export()导出类时,此静态方法会被调用。

  1. <?php 
  2. class A 
  3.  public $var1
  4.  public $var2
  5.  
  6.  public static function __set_state ($an_array) { 
  7.   $obj = new A; 
  8.   $obj->var1 = $an_array['var1']; 
  9.   $obj->var2 = $an_array['var2']; 
  10.   return $obj
  11.  } 
  12.  
  13. $a = new A; 
  14. $a->var1 = 5; 
  15. $a->var2 = 'foo'
  16. var_dump(var_export($a)); 
  17. ?> 

__clone()

当对象复制完成时调用,例如在设计模式详解及PHP实现:单例模式一文中提到的单例模式实现方式,利用这个函数来防止对象被克隆。

  1. <?php  
  2. public class Singleton { 
  3.  private static $_instance = NULL; 
  4.  
  5.  // 私有构造方法  
  6.  private function __construct() {} 
  7.  
  8.  public static function getInstance() { 
  9.   if (is_null(self::$_instance)) { 
  10.    self::$_instance = new Singleton(); 
  11.   } 
  12.   return self::$_instance
  13.  } 
  14.  
  15.  // 防止克隆实例 
  16.  public function __clone(){ 
  17.   die('Clone is not allowed.' . E_USER_ERROR); 
  18.  } 
  19. ?> 

魔术常量(Magic constants)

PHP中的常量大部分都是不变的,但是有8个常量会随着他们所在代码位置的变化而变化,这8个常量被称为魔术常量。

__LINE__,文件中的当前行号

__FILE__,文件的完整路径和文件名

__DIR__,文件所在的目录

__FUNCTION__,函数名称

__CLASS__,类的名称

__TRAIT__,Trait的名字

__METHOD__,类的方法名

__NAMESPACE__,当前命名空间的名称

这些魔术常量常常被用于获得当前环境信息或者记录日志。

Tags: php魔术方法 Magic methods

分享到: