魔术方法


魔术方法

__construct, __destruct (参看 构造方法和析构方法), __call, __callStatic, __get, __set, __isset, __unset (参看 重载), __sleep, __wakeup, __toString, __set_state__clone 等方法在PHP中被称为“魔术方法”(Magic methods)。 你在命名自己的类方法时不能使用这些方法名。

Caution

PHP把所有以__(两个下划线)开头的类方法当成魔术方法。所以你定义自己的类方法时,不要以 __为前缀。

__sleep__wakeup

serialize() 函数会检查是否存在一个魔术方法 __sleep.如果存在,__sleep()方法会先被调用, 然后才执行序列化操作。这个功能可以用于清理对象,并返回一个包含对象中所有变量名称的数组。如果该方法不返回任何内容,则NULL被序列化,导致 一个E_NOTICE错误。

__sleep方法常用于提交未提交的数据,或类似的操作。同时,如果你有一些很大的对象, 不需要保存,这个功能就很好用。

与之相反,unserialize()会检查是否存在一个__wakeup方法。如果存在,则会先调用 __wakeup方法,预先准备对象数据。

__wakeup经常用在反序列化操作中,例如重新建立数据库连接,或执行其它初始化操作。

Example #1 Sleep 和 wakeup

<?php
class Connection {
    protected 
$link;
    private 
$server$username$password$db;
    
    public function 
__construct($server$username$password$db)
    {
        
$this->server $server;
        
$this->username $username;
        
$this->password $password;
        
$this->db $db;
        
$this->connect();
    }
    
    private function 
connect()
    {
        
$this->link mysql_connect($this->server$this->username$this->password);
        
mysql_select_db($this->db$this->link);
    }
    
    public function 
__sleep()
    {
        return array(
'server''username''password''db');
    }
    
    public function 
__wakeup()
    {
        
$this->connect();
    }
}
?>

__toString

The __toString method allows a class to decide how it will react when it is converted to a string. __toString 方法可以让一个类决定它如何转换成一个字符串。

Example #2 简单示例

<?php
// Declare a simple class
class TestClass
{
    public 
$foo;

    public function 
__construct($foo) {
        
$this->foo $foo;
    }

    public function 
__toString() {
        return 
$this->foo;
    }
}

$class = new TestClass('Hello');
echo 
$class;
?>

以上例程会输出:

Hello

在PHP 5.2.0之前,__toString方法只有结合使用echo()print()时 才能生效。PHP 5.2.0之后,则可以在任何字符串环境生效(例如通过printf(),使用%s修饰符),但 不能用于非字符串环境(如使用%d修饰符)。从PHP 5.2.0,如果将一个未定义__toString方法的对象 转换为字符串,会报出一个E_RECOVERABLE_ERROR错误。

__invoke

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

Note:

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

Example #3 Using __invoke

<?php
class CallableClass {
    function 
__invoke($x) {
        
var_dump($x);
    }
}
$obj = new CallableClass;
$obj(5);
var_dump(is_callable($obj));
?>

以上例程会输出:

int(5)
bool(true)

__set_state

当调用var_export()时,这个静态 方法会被调用(自PHP 5.1.0起有效)。

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

Example #4 Using __set_state (PHP 5.1.0及更高版本支持)

<?php

class A
{
    public 
$var1;
    public 
$var2;

    public static function 
__set_state($an_array// As of PHP 5.1.0
    
{
        
$obj = new A;
        
$obj->var1 $an_array['var1'];
        
$obj->var2 $an_array['var2'];
        return 
$obj;
    }
}

$a = new A;
$a->var1 5;
$a->var2 'foo';

eval(
'$b = ' var_export($atrue) . ';'); // $b = A::__set_state(array(
                                            //    'var1' => 5,
                                            //    'var2' => 'foo',
                                            // ));
var_dump($b);

?>

以上例程会输出:

object(A)#2 (2) {
  ["var1"]=>
  int(5)
  ["var2"]=>
  string(3) "foo"
}

«  设计模式
» Final关键字
快速导航
PHP MySQL HTML CSS JavaScript MSSQL AJAX .NET JSP Linux Mac ASP 服务器 SQL jQuery C# C++ java Android IOS oracle MongoDB SQLite wamp 交通频道 作文范文 公司新员工工作总结_个人工作总结 电话的变迁 近读野史小说数种读后感600字 县计生局干部2010年解放思想心得体会 躲避 生活 感恩 营销人员应具备的素质之十大成功心态 我们家的“国宝熊猫” 汽车美容年度工作总结 励志小故事:即便外在条件悬殊,也能取得同样的成功 含羞草观察日记300字 半个学期过去了……作文450字 难题作文1200字 市工商局机关目标管理绩效考核办法(征求意见稿) 昙花物语·昙花一现 描写革命烈士的作文 2015预防职务犯罪演讲稿 人生感悟:瞬间就是一年,转眼就是一生 员工转正自我鉴定 基层公务员入党申请书1000字 2016财政票据个人述职报告 观看龙舟赛 2016年理论学习总结 极端人呐喊 致迷茫空虚的大学生 《公猫拿破仑》读书笔记600字 【精品】总经理助理职责 董事长助理职责 行政助理的职责 税收工作重在服务 甲流引发的喜和悲 感恩地球作文300字 最新安全教育活动总结 小学六年级作文1200字:似是故人来 [物是人非] 花酒 遗弃的流浪猫 留点“刺”痛给自己作文 父亲节,感恩的阳光 亲爱的,为你脱掉了太多,带身体的触摸。(言情小说) 关于正能量的名人最经典语录 绿色踪迹作文900字 坚持自己的信念作文550字 对不起真的没有关系吗 陈瞎子 毕业那年,我们散了 机械星球 痛苦也快乐作文 关于腊八粥的作文:腊八节感怀 一帮一工作总结【精品】 惜言如金的父亲 小学四年级作文400字:姥爷的生日

Copyright © 2016 phpStudy |