加入收藏 | 设为首页 | 会员中心 | 我要投稿 源码网 (https://www.900php.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2016-11-27 06:42:41 所属栏目:大数据 来源:站长网
导读:PHP中把以两个下划线__开头的方法称为魔术方法(Magic methods),这些方法在PHP中充当了举足轻重的作用。 魔术方法包括: __construct(),类的构造函数 __destruct(),类的析构函数 __call(),在对象中调用一个不可访问方法时调用 __callStatic(),用静态方

当在类外部使用serialize()时会调用这里的__sleep()方法
string(58) "O:6:"Person":2:{s:4:"name";s:8:"5bCP5piO";s:3:"age";i:25;}" 当在类外部使用serialize()时会调用这里的__sleep()方法
当在类外部使用unserialize()时会调用这里的__wakeup()方法
object(Person)#2 (3) { ["sex"]=gt; string(3) "男" ["name"]=gt; int(2) ["age"]=gt; int(25) }

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

作用:

__toString() 方法用于一个类被当成字符串时应怎样回应。例如 `echo $obj;` 应该显示些什么。

注意:

此方法必须返回一个字符串,否则将发出一条 `E_RECOVERABLE_ERROR` 级别的致命错误。

警告:

不能在 __toString() 方法中抛出异常。这么做会导致致命错误。

代码:

lt;#63;php
class Person
{
  public $sex;
  public $name;
  public $age;

  public function __construct($name="", $age=25, $sex='男')
  {
    $this-gt;name = $name;
    $this-gt;age = $age;
    $this-gt;sex = $sex;
  }

  public function __toString()
  {
    return 'go go go';
  }
}

$person = new Person('小明'); // 初始赋值
echo $person;

结果:

go go go

那么如果类中没有 __toString() 这个魔术方法运行会发生什么呢?让我们来测试下:

代码:

lt;#63;php
class Person
{
  public $sex;
  public $name;
  public $age;

  public function __construct($name="", $age=25, $sex='男')
  {
    $this-gt;name = $name;
    $this-gt;age = $age;
    $this-gt;sex = $sex;
  }
  
}

$person = new Person('小明'); // 初始赋值
echo $person;

结果:

Catchable fatal error: Object of class Person could not be converted to string in D:phpStudyWWWtestindex.php on line 18
很明显,页面报了一个致命错误,这是语法所不允许的。

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

作用:

当尝试以调用函数的方式调用一个对象时,__invoke() 方法会被自动调用。

注意:

本特性只在 PHP 5.3.0 及以上版本有效。

直接上代码:

lt;#63;php
class Person
{
  public $sex;
  public $name;
  public $age;

  public function __construct($name="", $age=25, $sex='男')
  {
    $this-gt;name = $name;
    $this-gt;age = $age;
    $this-gt;sex = $sex;
  }

  public function __invoke() {
    echo '这可是一个对象哦';
  }

}

$person = new Person('小明'); // 初始赋值
$person();

查看运行结果:

这可是一个对象哦

当然,如果你执意要将对象当函数方法使用,那么会得到下面结果:

Fatal error: Function name must be a string in D:phpStudyWWWtestindex.php on line 18

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

作用:

自 PHP 5.1.0 起,当调用 var_export() 导出类时,此静态方法会被自动调用。

参数:

本方法的唯一参数是一个数组,其中包含按 array('property' =gt; value, ...) 格式排列的类属性。

下面我们先来看看在没有加 __set_state() 情况按下,代码及运行结果如何:

上代码:

lt;#63;php
class Person
{
  public $sex;
  public $name;
  public $age;

  public function __construct($name="", $age=25, $sex='男')
  {
    $this-gt;name = $name;
    $this-gt;age = $age;
    $this-gt;sex = $sex;
  }

}

$person = new Person('小明'); // 初始赋值
var_export($person);

看结果:

Person::__set_state(array( 'sex' =gt; '男', 'name' =gt; '小明', 'age' =gt; 25, ))

很明显,将对象中的属性都打印出来了

加了 __set_state() 之后:

继续上代码:

lt;#63;php
class Person
{
  public $sex;
  public $name;
  public $age;

  public function __construct($name="", $age=25, $sex='男')
  {
    $this-gt;name = $name;
    $this-gt;age = $age;
    $this-gt;sex = $sex;
  }

  public static function __set_state($an_array)
  {
    $a = new Person();
    $a-gt;name = $an_array['name'];
    return $a;
  }

}

$person = new Person('小明'); // 初始赋值
$person-gt;name = '小红';
var_export($person);

继续看结果:

Person::__set_state(array( 'sex' =gt; '男', 'name' =gt; '小红', 'age' =gt; 25, ))

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

在多数情况下,我们并不需要完全复制一个对象来获得其中属性。但有一个情况下确实需要:如果你有一个 GTK 窗口对象,该对象持有窗口相关的资源。你可能会想复制一个新的窗口,保持所有属性与原来的窗口相同,但必须是一个新的对象(因为如果不是新的对象,那么一个窗口中的改变就会影响到另一个窗口)。还有一种情况:如果对象 A 中保存着对象 B 的引用,当你复制对象 A 时,你想其中使用的对象不再是对象 B 而是 B 的一个副本,那么你必须得到对象 A 的一个副本。

作用:

对象复制可以通过 clone 关键字来完成(如果可能,这将调用对象的 __clone() 方法)。对象中的 __clone() 方法不能被直接调用。

语法:

$copy_of_object = clone $object;

注意:

当对象被复制后,PHP 5 会对对象的所有属性执行一个浅复制(shallow copy)。所有的引用属性 仍然会是一个指向原来的变量的引用。

(编辑:源码网)

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

热点阅读