PHP教程中使用魔术方法的例子(PHP魔术函数)

复制代码代码如下所示:
在PHP / * __(两个下划线)在一开始的方法作为一种魔法。所以你定义你自己的方法,不__前缀。* * /

__tostring,__set,__get__isset / __unset,()()
*
的__tostring方法允许一个类来决定它将如何反应
__set()运行时数据写入到人迹罕至的成员。
__get()用于从人迹罕至的成员读数据。
__isset()是通过调用isset()触发或空()在人迹罕至的成员。
__unset()被调用时设置()用于访问成员。
* /
class TestClass {

私有数据=数组();
公共$;

公共功能__construct($ Foo){
$;
}

公共功能__tostring(){
返回$;
}

公共功能__set($name,美元价值){
回声__set,设置name'to美元美元的价值;
这个数据{ $ };
}

公共功能__get($name){
回声__get,获得美元的名字;
如果(array_key_exists($name,美元->数据)){
返回$ >数据{名称};
}
}

在PHP 5.1.0 * / / * *
公共功能__isset($name){
回声__isset美元,是name'set ;
返回isset(美元->数据{ $名});
}

在PHP 5.1.0 * / / * *
公共功能__unset($name){
回声__unset,解封' $名字;
unset(美元->数据{ $名});
}

}

$ obj =新TestClass(你好);
回声__tostring obj,$ ;
obj -> = 1美元;
echo $ obj -> A. ;
var_dump(isset($ obj -> a));
unset($ obj ->一);
var_dump(isset($ obj -> a));

/ * *
输出结果如下:
__tostring,你好
__set,setting'a'to 1
__get,getting'a
__isset,is'a'set
布尔(真的)
__unset,unsetting'a
__isset,is'a'set
Bool(假)
**



__call / / __callstatic
*
混合__call(字符串的名称,数组参数)
混合__callstatic(字符串的名称,数组参数)
__call()被触发时调用访问方法在对象上下文。
__callstatic()被触发时调用访问方法在静态语境。
name参数是被调用方法的名称。
$参数参数是一个枚举数组,其中包含传递给
* /
Class MethodTest {
公共功能__call($name,$参数){
注意:$的值是大小写。
回声__call,调用对象的方法的名称美元。内爆(',',为参数)。;
}

在PHP 5.3.0 * / / * *
公共静态函数__callstatic($name,$参数){
注意:$的值是大小写。
回声__callstatic,调用静态方法的名称美元。内爆(',',为参数)。;
}

}

$ obj =新方法;
$ obj ->运行测试(在对象上下文,'param2 ','param3);
/ /测试::运行测试(在静态语境'); / / PHP 5.3.0


输出结果如下:
__call method'runtest'in对象,调用对象的背景下,param2,param3
字符串(10)__invoke:
* /



/ / __invoke
*
的__invoke方法是当一个脚本试图调用一个称为
注:此功能是自PHP 5.3.0。
* /
类CallableClass {
功能__invoke($ x){
var_dump(X元);
}
}

$ obj =新CallableClass;
/ / $ obj(5);
var_dump('__invoke:'。is_callable($ obj));






__sleep / / __wakeup
*
序列化序列化可以变换为连续的字节数据对象的变量包括。可以将序列化变量传输到一个文件或在网络上传输。
然后反序列化恢复原来的数据。在你定义对象反序列化的类,它的属性和方法的PHP对象可以存储成功。
有时你可能在反序列化后立即执行,需要一个对象。为此,PHP会自动找到__sleep和__wakeup方法。
当一个对象被序列化,PHP将调用__sleep方法(如果存在的话)。在反序列化一个对象,PHP将调用__wakeup方法。
这两种方法都不接受参数。的__sleep方法必须返回一个数组,包含属性,需要序列化。PHP将丢弃其他属性的值。
如果没有__sleep方法,PHP将保存所有的性质。The following example shows how to serialize an object with the __sleep and __wakeup methods.
id属性是一个临时属性,不打算保留在对象中。的__sleep方法确保ID属性不包括在序列化的对象。
当反序列化对象的用户,一个建立__wakeup id属性值的新方法。这个例子是为了自我维持而设计的。
在实际开发中,您可能会发现包含资源的对象,如图像或数据流,需要这些方法。
* /

类用户{

公开名称;
公共身份证;

功能__construct(){
给用户一个唯一的ID,给出一个不同的ID
美元-> ID = uniqid();
}

的 / / __sleep返回值类型是一个数组,而数组中的值是一个字段,不需要打印。

功能__sleep(){
/ /不序列化->不是序列化ID
返回(数组(name));
}

功能__wakeup(){
给用户一个唯一的ID
美元-> ID = uniqid();
}

}

创建对象设置设备
新用户;
$ U ->名称= 列昂; / /它序列化序列化注重非序列化的属性,和ID的值是被遗弃的
$ S =连载($ U);
回声__sleep,__wakeup,:$ S ; / /序列化它序列化ID重新分配
$ U2 =序列化(的); / / $ U和U2有不同的IDS美元美元美元U和U2的ID
print_r(为你);
print_r($ U2);


输出结果如下:
__sleep,__wakeup,::4:用户:1:{:4:名;:4:列昂;}
用户对象

{列昂
{id} = > 4db1b17640da1

用户对象

{列昂
{id} = > 4db1b17640dbc

* /


/ / __set_state
*
这种静态的方法称为出口的var_export类()因为PHP
这个方法的唯一参数是一个数组包含出口性质的阵列(财产的价值,…)。
* /

类{

公共元VAR1;
公共$ VAR2;

公共静态函数__set_state($ an_array PHP){ / / 5.1.0
/ / $ an_array是打印出来作为一个数组,而不是一个对象在调用的时候了
print_r($ an_array);
$ obj =新一;
$ obj -> var1 = $ an_array { 'var1};
$ obj -> var2 = $ an_array { 'var2};
返回的对象;
}

}

美元=新的;
美元-> var1 = 5;
美元-> var2 = 'foo;
回声__set_state:;
eval($ B =。var_export($,真的)。;);
/ / $ =一:(阵列(:__set_state
/ / 'var1= > 5,
/ / 'var2= > 'foo,
);
var_dump($);


输出结果如下:
__set_state:
阵列

{ 5 } var1 = >
{ } = > foo VAR2

对象(一)# 5(2){
{var1} = >
Int(5)
{VAR2} = >
字符串(3)
}
* /



/ / __clone
类的子对象{

静态$实例= 0;
公共$实例;

公共功能__construct(){
$ >实例::$实例;
}

公共功能__clone(){
$ >实例::$实例;
}

}

类mycloneable {

公众发生美元;
公众为object2;

功能__clone(){
强制复制该对象,否则为
将指向相同的对象。
美元-> object1 =克隆美元-> object1;
}

}

$ obj =新mycloneable();
$ obj -> object1 =新的子对象();
$ obj -> object2 =新的子对象();
$ obj2 =克隆$ obj;
打印(__clone,原始对象:;
print_r($ obj);
打印(__clone,克隆对象:;
print_r($ obj2);


输出结果如下:
__clone,原始对象:
mycloneable对象

{ } = >子对象的对象发生

{实例} > 1
{ object2 } = >子对象的对象)

{实例} > 2
))
__clone,克隆对象:
mycloneable对象

{ } = >子对象的对象发生

{实例} > 3
{ object2 } = >子对象的对象)

{实例} > 2
))
* /