加入收藏 | 设为首页 | 会员中心 | 我要投稿 揭阳站长网 (https://www.0663zz.cn/)- 机器学习、行业智能、决策智能、云计算、AI应用!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

带你吃透16个PHP魔术方法

发布时间:2022-08-10 11:22:23 所属栏目:PHP教程 来源:互联网
导读:在PHP中,以双下划线(__)开始命名的方法被称作PHP中的魔术方法,它们在PHP中充当很重要的角色。魔术方法包括: 方法名 描述 __construct() 类的构造函数 __destruct() 类的析构函数 __call($funName, $arguments) 当调用一个未定义或不可达方法时, __call
  在PHP中,以双下划线(__)开始命名的方法被称作PHP中的魔术方法,它们在PHP中充当很重要的角色。魔术方法包括:
 
  方法名 描述
  __construct() 类的构造函数
  __destruct() 类的析构函数
  __call($funName, $arguments) 当调用一个未定义或不可达方法时, __call() 方法将被调用。
  __callStatic($funName, $arguments) 当调用一个未定义或不可达的静态方法时, __callStatic() 方法将被调用。
  __get($propertyName) 当获取一个类的成员变量时, __get() 方法将被调用。
  __set($property, $value) 当赋值一个类的成员变量时, __set() 方法将被调用。
  __isset($content) 当调用 isset() 或 empty() 对一个未定义或不可达的成员赋值时, __isset() 方法将被调用。
  __unset($content) 当调用 reset() 对一个未定义或不可达的成员更新时, __unset() 方法将被调用。
  __sleep() 当执行序列化 serialize() 时,__sleep() 方法将首先被调用。
  __wakeup() 当执行反序列化 deserialization() 时, __wakeup() 方法将首先被调用。
  __toString() 当使用 echo 方法直接输出显示对象时,__toString() 方法首先被调用。
  __invoke() 使用调用函数(function)访问一个对象时, __invoke() 方法将首先被调用。
  __set_state($an_array) 当调用 var_export() 方法时,__set_state() 方法将被调用。
  __clone() 当对象被复制赋值时,__clone() 方法将被调用。
  __autoload($className) 试图载入一个未定义的类时调用。
  __debugInfo() 输出 debug 信息。
  本文将使用一些实例展示 PHP 魔术方法的运用。
 
  1.__construct()
  当创建对象时,PHP 类的构造方法是第一个被调用的方法。每个类都有构造方法。若你没在类中明确声明定义它,将会有一个默认的无参类构造方法存在,虽然它不会在类中定义出现。
 
  1) 构造方法的运用
 
  类的构造方法通常用于执行一些初始化任务,诸如当创建对象时,为成员初始化赋值。
 
  2) 类中构造方法的声明格式
 
 
  function __constrct([parameter list]){
 
   
 
      方法具体实现 //通常为成员变量初始赋值。
 
   
 
  }
 
  注意: 在多数类中仅可以声明一个构造方法。因为, PHP 不支持构造方法重载。
 
  下面是个完整的例子:
 
 
 
 
  <?php
 
      class Person
 
      {                                                                     
 
              public $name;       
 
              public $age;       
 
              public $sex;       
 
   
 
          /**
 
           * 明确定义含参的构造方法
 
           */                                                                                      
 
          public function __construct($name="", $sex="Male", $age=22)
 
          {     
 
              $this->name = $name;
 
              $this->sex = $sex;
 
              $this->age = $age;
 
          }
 
   
 
          /**
 
           * say 方法定义
 
           */
 
          public function say()
 
          {
 
              echo "Name:" . $this->name . ",Sex:" . $this->sex . ",Age:" . $this->age;
 
          }   
 
   
 
      }
 
  无参创建 $Person1 对象。
 
 
 
  $Person1 = new Person();
 
  echo $Person1->say(); //显示:Name:,Sex:Male,Age:22
 
  使用一个参数 "Jams" 调用创建 $Person2 对象。
 
 
 
  $Person2 = new Person("Jams");
 
  echo $Person2->say(); // 显示: Name: Jams, Sex: Male, Age: 22
 
  使用3个参数调用创建 $Person3 对象。
 
 
 
  $Person3 = new Person ("Jack", "Male", 25);
 
  echo $Person3->say(); // 显示:Name: Jack, Sex: Male, Age: 25
 
  __destruct()
  析构函数与构造函数相反。
 
  析构函数允许你在销毁对象之前执行一些操作,例如关闭文件,清空结果集等等。
 
  析构函数是 PHP 5 引入的新功能。
 
  析构函数的声明与构造函数类似,以两个下划线开头,名称固定为 __destruct()。
 
  析构函数的声明
 
 
 
 
  function __destruct()
 
  {
 
      //method body
 
  }
 
  析构函数不能带参数。
 
  析构函数的使用
  析构函数在类中一般不常见。它是类的可选部分,通常用于在类销毁之前完成一些清理任务。
 
  这是使用析构函数的示例:
 
 
 
  <?php
 
  class Person{     
 
   
 
      public $name;         
 
      public $age;         
 
      public $sex;         
 
   
 
      public function __construct($name="", $sex="Male", $age=22)
 
      {   
 
          $this->name = $name;
 
          $this->sex  = $sex;
 
          $this->age  = $age;
 
      }
 
   
 
      /**
 
       * say method
 
       */
 
      public function say()
 
      {
 
          echo "Name:".$this->name.",Sex:".$this->sex.",Age:".$this->age;
 
      }   
 
   
 
      /**
 
       * declare a destructor method
 
       */
 
      public function __destruct()
 
      {
 
              echo "Well, my name is ".$this->name;
 
      }
 
  }
 
   
 
  $Person = new Person("John");
 
  unset($Person); //destroy the object of $Person created above
 
  输出结果
 
 
  Well, my name is John
 
  __call()
  该方法接受两个参数。第一个参数为未定义的方法名称,第二个参数则为传入方法的参数构成的数组
 
  使用
 
 
 
 
  function __call(string $function_name, array $arguments)
 
  {
 
      // method body
 
  }
 
  在程序中调用未定义方法时, __call() 方法将被调用。

(编辑:揭阳站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读