name = $name;
$this->age = $age;
$this->sex = $sex;
}
//echo 对象时调用
function __toString(){
return '本人的基本信息如下:我是津沙港湾,30岁,男性
';
}
//clone对象时调用
function __clone(){
echo '克隆一个对象,this是一个副本
';
$this->name;
$this->age=20;
$this->sex;
}
/*
//提示信息
function __call($method,$args){
echo '在调用一个对象中不存的方法时自动调用__call
';
echo "调用的方法{$method}(),参数为:";
print_r($args);
echo "不存在
";
}
*/
//调用不同的方法名
function __call($method,$args){
if(in_array($method, $this->marr)){
foreach ($args as $arg)
echo $arg."
";
}else{
echo "您调用的方法{$method}()不存在";
}
}
static function __callstatic($method,$args){
echo "您调用的静态方法{$method}不存在";
}
function say() {
echo '我是津沙港湾
';
}
//串行化 serialize时调用
function __sleep(){
echo '指定串行化的对象属性名
';
return array('name','age');//必须返回数组
//指定只串行化name和age这个两个对象属性
//O:6:"Person":2:{s:4:"name";s:12:"津沙港湾";s:3:"age";i:23;}
}
//反串行化 unserialize时调用
function __wakeup(){
echo '反串行化时自动调用
';
//反串行化时设置成员属性的值
$this->age = 43;
}
//var_export导出类信息
static function __set_state($arr){//参数是数组
echo 'var_export导出类信息时自动调用
';
$p = new Person("小状元", 33, "female");
$p->name = $arr['name'];
$p->age = $arr['age'];
$p->sex = $arr['sex'];
return $p;
}
//调用函数方式调用对象 $p();
function __invoke($a,$b,$c){
echo '调用函数方式调用对象时自动调用'.$a.$b.$c.'
';
}
}
//原本
$p = new Person('津沙港湾',23,'男');
//toString()
echo $p;
//__call()
$p->eat('鱼','肉');
$p->drink('茶','酒');
$p->song('歌','戏');
//副本 __clone()
$a = clone $p;
echo $a->age;
//serialize 对象转成字符串
$str = serialize($p);
//O:6:"Person":4:{s:4:"name";s:12:"津沙港湾";s:3:"age";i:23;s:3:"sex";s:3:"男";s:4:"marr";a:3:{i:0;s:3:"eat";i:1;s:5:"drink";i:2;s:4:"song";}}
file_put_contents("MrYang.txt", $str);
echo '对象串行化成功,保存到MrYang文件中';
$arr = array(
'name' => '津沙港湾',
'age' => 32,
'sex' => 'male',
);
//数组串行化{"name":"\u6d25\u6c99\u6e2f\u6e7e","age":32,"sex":"male"}
$str = json_encode($arr);
echo $str;
//数组反串行化 转成对象
$parr = json_decode($str);
var_dump($parr);//变成一个对象
/*
object(stdClass)[1]
public 'name' => string '津沙港湾' (length=12)
public 'age' => int 32
public 'sex' => string 'male' (length=4)
*/
//变成一个对象
echo $parr->name;
//转成数组 要加第二个参数true
$parr = json_decode($str,true);
var_dump($parr);
//var_export __set_state()
$p = new Person("津沙港湾", 20, "male");
//设定的属性可以传到$arr中去
$p->name = '火山岛';
$p->age = 500;
$p->sex = 'male';
eval('$b='.var_export($p,true).';');//加ture变成字符串
var_dump($b);//类信息以__set_state()中设定值为准
//调用函数方式
$p(1,2,3);
//__callstatic 调用不存在的静态方法时自动调用
Person::speak();
//__autoload 调用类中的方法时自动加载类文件
function __autoload($classname){
include $classname.'.class.php';
}
Test::laugh();
对象反串行化
include 'index.php';
//读取文件内容 字符串
$str = file_get_contents('MrYang.txt');
//反串行化 字符串转成对象
$p = unserialize($str);
$p ->say();
echo $p->age;
分享名称:PHP对象魔术方法
文章链接:
http://cdxtjz.cn/article/pgpjgo.html