您的位置:首页 > 编程语言 > PHP开发

PHP 对象 魔术方法

2016-08-31 23:32 441 查看
<?php
header('content-type:text/html;charset=utf-8');
/*
* __construct()构造方法
* 在对象初始化时自动调用
* __destruct()析构方法
* 在对象释放资源时自动调用
* __get()取值
* 在取私有属性值时自动调用
* __set()设置值
* 在设置私有属性值自动调用
* __isset()判断值
* 在使用isset()判断私有属性是否存在时自动调用
* __unset()释放值
* 在使用unset()释放私有属性时自动调用
* __toString() 用于一个类被当成字符串时应怎样回应
* __call() 在对象中调用一个不可访问方法时,__call() 会被调用。
* __callstatic()用静态方式中调用一个不可访问方法时,__callStatic() 会被调用。 ::
* __sleep() 在串行化serialize时自动调用的方法
*  __wakeup() 在反串行化时自动调用的方法
* __set_state() 当调用 var_export() 导出类时,此静态 方法会被调用。
* __invoke()当尝试以调用函数的方式调用一个对象时,__invoke() 方法会被自动调用。
* __autoload() 唯一一个在类外部进行定义 自动加载 只要在这个脚本中,需要加载类的时候(必须用到类名)就会自动调用这个方法。
*
* 魔术方法的总结:
* 1.自动调用,但不同的魔术方法,有自己的调用时机
* 2.都是以__开始的方法
* 3.所有的魔术方法,方法名都是固定的
* 4.如果不写,就不存在,也就没有默认的功能。
*
* __toString()
* 1.是在直接使用echo print printf输出一个对象引用时,自动调用的方法
* 2.将对象的基本信息放在__toString()方法内部,形成字符串返回。
* 3.__toString()方法中不能有参数。
*
* 克隆对象
* 1.使用clone这个关键字复制一个对象
*
* __clone()魔术方法
* 1.是在克隆对象时自动调用的方法
* 2.作用:和构造方法一样,是对新克隆的对象进行初始化
*
* __call()
* 1.就是在调用一个对象中不存的方法时,自动调用的方法
* 2.有两个参数,第一个参数是,调用的不存在的方法的方法名,第二个参数是调用不存在的方法的方法参数
* 作用:
* 1.可以写提示信息
* 2.将方法的功能相似,但方法名还要不同的,就可以采用这个方式来完成
*
*
* 对象串行化  (序列化)
* 1.将对象转成字符串---串行化
*  __sleep()
*  作用:
*  可以设置需要串行化的对象的属性
*  只要在这个方法中,返回一个数组,在数组中声明了那个属性名,那个属性名就会被串行化。
*  没有声明的属性名,不串行化
*  默认这个方法,全部串行化
* 2.将字符串转成对象---反串行化
* __wakeup() 在反串行化时自动调用
* 作用:
* 对象串行化的对象回来后,进行对象的初始化,相当于__construct()
* serialize() 函数会检查类中是否存在一个魔术方法 __sleep() 如果存在,该方法会先被调用,然后才执行序列化操作
* 注意(串行化时机)
* 1.将对象需要进行网络传输时。
* 2.将对象持久保存时。
*
* 数组串行化 json  ----javascript object notation
*
* 1.eval()函数--检查并执行PHP代码
* $str = "echo 'abc' ;";
* eval($str);
*/

class Person{
public $name;
public $age;
public $sex;
public $marr = array('eat','drink','song');
//初始化时调用构造函数
function __construct($name,$age,$sex){
$this->name = $name;
$this->age     = $age;
$this->sex     = $sex;
}
//echo 对象时调用
function __toString(){
return '本人的基本信息如下:我是津沙港湾,30岁,男性<br/>';
}
//clone对象时调用
function __clone(){
echo '克隆一个对象,this是一个副本<br/>';
$this->name;
$this->age=20;
$this->sex;
}
/*
//提示信息
function __call($method,$args){
echo '在调用一个对象中不存的方法时自动调用__call<br/>';
echo "调用的方法{$method}(),参数为:";
print_r($args);
echo "不存在<br/>";
}
*/
//调用不同的方法名
function __call($method,$args){
if(in_array($method, $this->marr)){
foreach ($args as $arg)
echo $arg."<br/>";
}else{
echo "您调用的方法{$method}()不存在";
}
}

static function __callstatic($method,$args){
echo "您调用的静态方法{$method}不存在";
}

function say() {
echo '我是津沙港湾<br/>';
}

//串行化 serialize时调用
function __sleep(){
echo '指定串行化的对象属性名<br/>';
return array('name','age');//必须返回数组
//指定只串行化name和age这个两个对象属性
//O:6:"Person":2:{s:4:"name";s:12:"津沙港湾";s:3:"age";i:23;}
}

//反串行化 unserialize时调用
function __wakeup(){
echo '反串行化时自动调用<br/>';
//反串行化时设置成员属性的值
$this->age = 43;
}

//var_export导出类信息
static function __set_state($arr){//参数是数组
echo 'var_export导出类信息时自动调用<br/>';
$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.'<br/>';
}

}

//原本
$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 对象 魔术方法