分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > IT知识

PHP之十六个魔术方法详细介绍

发布时间:2023-09-06 01:41责任编辑:白小东关键词:PHP

PHP中把以两个下划线__开头的方法称为魔术方法(Magic methods)

魔术方法包括:

    • __construct(),类的构造函数
    • __destruct(),类的析构函数
    • __call(),在对象中调用一个不可访问方法时调用
    • __callStatic(),用静态方式中调用一个不可访问方法时调用
    • __get(),获得一个类的成员变量时调用
    • __set(),设置一个类的成员变量时调用
    • __isset(),当对不可访问属性调用isset()或empty()时调用
    • __unset(),当对不可访问属性调用unset()时被调用。
    • __sleep(),执行serialize()时,先会调用这个函数
    • __wakeup(),执行unserialize()时,先会调用这个函数
    • __toString(),类被当成字符串时的回应方法
    • __invoke(),调用函数的方式调用一个对象时的回应方法
    • __set_state(),调用var_export()导出类时,此静态方法会被调用。
    • __clone(),当对象复制完成时调用
    • __autoload(),尝试加载未定义的类
    • __debugInfo(),打印所需调试信息

      一、 __construct(),类的构造函数

      php中构造方法是对象创建完成后第一个被对象自动调用的方法。在每个类中都有一个构造方法,如果没有显示地声明它,那么类中都会默认存在一个没有参数且内容为空的构造方法。

      1、 构造方法的作用

      通常构造方法被用来执行一些有用的初始化任务,如对成员属性在创建对象时赋予初始值。

      2、 构造方法的在类中的声明格式

      ?
      1
      2
      3
      4
      function __constrct([参数列表]){
      方法体 //通常用来对成员属性进行初始化赋值
      }

      3、 在类中声明构造方法需要注意的事项

      1、在同一个类中只能声明一个构造方法,原因是,PHP不支持构造函数重载。

      2、构造方法名称是以两个下画线开始的__construct()

      下面是它的例子:

      ?
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      <?php
      class Person
      {
      public $name;
      public $age;
      public $sex;
      /**
      * 显示声明一个构造方法且带参数
      */
      public function __construct($name="", $sex="男", $age=22)
      {
      $this->name = $name;
      $this->sex = $sex;
      $this->age = $age;
      }
      /**
      * say 方法
      */
      public function say()
      {
      echo "我叫:" . $this->name . ",性别:" . $this->sex . ",年龄:" . $this->age;
      }
      }

      创建对象$Person1且不带任参数

      ?
      1
      2
      $Person1 = new Person();
      echo $Person1->say(); //输出:我叫:,性别:男,年龄:27

      创建对象$Person2且带参数“小明”

      ?
      1
      2
      $Person2 = new Person("小明");
      echo $Person2->say(); //输出:我叫:张三,性别:男,年龄:27

      创建对象$Person3且带三个参数

      ?
      1
      2
      $Person3 = new Person("李四","男",25);
      echo $Person3->say(); //输出:我叫:李四,性别:男,年龄:25

      二、__destruct(),类的析构函数

      通过上面的讲解,现在我们已经知道了什么叫构造方法。那么与构造方法对应的就是析构方法。

      析构方法允许在销毁一个类之前执行的一些操作或完成一些功能,比如说关闭文件、释放结果集等。

      析构方法是PHP5才引进的新内容。

      析造方法的声明格式与构造方法 __construct() 比较类似,也是以两个下划线开始的方法 __destruct() ,这种析构方法名称也是固定的。

      1、 析构方法的声明格式

      ?
      1
      2
      3
      4
      function __destruct()
      {
      //方法体
      }

      注意:析构函数不能带有任何参数。

      2、 析构方法的作用

      一般来说,析构方法在PHP中并不是很常用,它属类中可选择的一部分,通常用来完成一些在对象销毁前的清理任务。
      举例演示,如下:

      ?
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      <?php
      class Person{
      public $name;
      public $age;
      public $sex;
      public function __construct($name="", $sex="男", $age=22)
      {
      $this->name = $name;
      $this->sex = $sex;
      $this->age = $age;
      }
      /**
      * say 说话方法
      */
      public function say()
      {
      echo "我叫:".$this->name.",性别:".$this->sex.",年龄:".$this->age;
      }
      /**
      * 声明一个析构方法
      */
      public function __destruct()
      {
      echo "我觉得我还可以再抢救一下,我的名字叫".$this->name;
      }
      }
      $Person = new Person("小明");
      unset($Person); //销毁上面创建的对象$Person

      上面的程序运行时输出:

      我觉得我还可以再抢救一下,我的名字叫小明

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

      该方法有两个参数,第一个参数 $function_name 会自动接收不存在的方法名,第二个 $arguments 则以数组的方式接收不存在方法的多个参数。

      1、 __call() 方法的格式:

      ?
      1
      2
      3
      4
      function __call(string $function_name, array $arguments)
      {
      // 方法体
      }

      2、 __call() 方法的作用:

      为了避免当调用的方法不存在时产生错误,而意外的导致程序中止,可以使用 __call() 方法来避免。

      该方法在调用的方法不存在时会自动调用,程序仍会继续执行下去。

      请参考如下代码:

      ?
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      <?php
      class Person
      {
      function say()
      {
      echo "Hello, world!<br>";
      }
      /**
      * 声明此方法用来处理调用对象中不存在的方法
      */
      function __call($funName, $arguments)
      {
      echo "你所调用的函数:" . $funName . "(参数:" ; // 输出调用不存在的方法名
      print_r($arguments); // 输出调用不存在的方法时的参数列表
      echo ")不存在!<br>\n"; // 结束换行
      }
      }
      $Person = new Person();
      $Person->run("teacher"); // 调用对象中不存在的方法,则自动调用了对象中的__call()方法
      $Person->eat("小明", "苹果");
      $Person->say();

      运行结果:

      你所调用的函数:run(参数:Array ( [0] => teacher ) )不存在!

      你所调用的函数:eat(参数:Array ( [0] => 小明 [1] => 苹果 ) )不存在!

      Hello, world!

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

      此方法与上面所说的 __call() 功能除了 __callStatic() 是未静态方法准备的之外,其它都是一样的。

      请看下面代码:

      ?
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      <?php
      class Person
      {
      function say()
      {
      echo "Hello, world!<br>";
      }
      /**
      * 声明此方法用来处理调用对象中不存在的方法
      */
      public static function __callStatic($funName, $arguments)
      {
      echo "你所调用的静态方法:" . $funName
      我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
      icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved