原以为多态是一个什么样复杂的概念,其实很简单。多态就是指方法的重写,定义一个父类(接口),各个子类不同,但必须有接口所定义的方法,因此,这些应用统一接口的类就都有接口中定义的规范,这样就满足了接口所定的要求。
对象串行化(序列化)
1、 将对象转成字符串(不用看懂) ---串行化
2、 将字符串转会对象 ---反串行化
注意(串行化的时机)
1、 将对象在网络中传输
2、 将对象持久保存
成功生成一个对象后,就可以对它进行串行化了。
格式:$person= new Person(“张三”,”男”,20);
$person_string=serialize($person);
其中serialize就把这个对象穿行成字符串了,如果想在多个脚本间用它,可以把它放在session里面。
然而,当你想把这串行后的字符串恢复到对象,你就可以对它进行反串行化。
格式:$person=unserialize($person_string); //这样$person就是一个完整的对象了
$person->say();
关于串行化,php有两个魔术方法,__sleep()和__wakeup()。
__sleep()是使用serialize()的时候用的,他不需要任何参数(其实你相加就加,它也只是一个方法),但这个函数需要返回一个数组,在数组中包含需要串行化的对象成员名。
格式:
function __sleep(){
$arr=array(“name”,”age”);
return ($arr);
}
然互 function __wakeup()就是在反串行化(使用unserialize)的时候用的。它就相当于这个时期的构造函数,为成员属性赋值。
格式:
function __wakeup(){
$this->age=40;
}
php数组穿行成josn格式的字符串。
格式:
$arr=arry(“name”->”dafanzi”,”age”->10,”sex”->”man”);
$str=json_encode($arr);
echo $str;
反串行化格式:
$parr=json_decode($str,[true]);//第二个参数默认是false,此时返回对象。当第二个参数设置为true的时候,就返回php数组了
Eval()函数把字符串按照php代码来计算
格式:
$str=”echo ‘abc’;”;
eval($str);
var __dump()这个函数打印出这个数据类型,以及类容,但格式不是php代码形式的(不过这个时候字符串形式的),不过你用var_export()函数就可以打印出php代码形式的。如果此时构造这么一句:$a=eval(“$b=”.var_export($arr,true).”;”);注意一点,这个函数 var_export($arr,true)里的true是一个可选参数,当你不选的时候他只是在屏幕上打印出来,代码形式的变量信息。只有选为true,它才会有返回值,才可以给别的变量赋值。如果$arr那里代表的是一个变量,你用简单的$b=var_export($arr,true)。他只是返回一个字符串形式的对象信息,如果要让$b成功赋值成一个对象,你就得用eval(‘$b=’.var_ecport($arr,true).”;”);
但此时需要用到__set_state(),这个方法是在var_export()导出对象信息时候用到。这个函数需要一个数组参数。为了导出对象,在里面声明一个对象,并返回。注意这个方法必须是静态的。这个函数的一个关联数组参数,记录的是一个在需要打印的那个对象的属性。键为属性名。
格式:
……
static function __set_state($arr) {
$p= new Person("李四", 30, "女");
$p->name=$arr['name'];
$p->age = $arr['age'];
return$p;
}
……
$p = new Person("张三", 20,"男");
$p->name="李小四";
$p-> age= 33;
eval('$b='.var_export($p, true).";");
var_dump($b);
__invoke()这个函数是在对象实例后,直接想变量函数调用是,就会自动化调用这个函数,这个函数和其他普通函数一样,也是可以有参数的。
格式:……
function__invoke($a, $b, $c) {
echo"在对象引用后加上()调用时自动调用这个方法{$a}=={$b}=={$c}<br>";
}
……
$p= new Person("张三", 20, "男");
$p(1,2, 4);
__callstatic()函数是你在外面直接调用一个静态方法是执行的,形式和__call()差不多,只是这个函数需要声明为静态的,共有的。
staticfunction __callstatic($method, $args) {
echo"你调用的静态方法$method(".implode(",", $args).")不存在";
}
接下介绍的这份魔术方法很特殊。他是在类外面用的,当在这个脚本需要加载类的时候(必须用到类名),就会自动调用这个方法。
格式
Function __autoload($classname){
includestrtolower($classname).”.class.php”;
}
$t=new Test();
$st=new Hello();
Word::four(); |