PHP面向对象继承(二)

论坛 期权论坛 脚本     
已经匿名di用户   2022-5-29 19:29   1370   0

原以为多态是一个什么样复杂的概念,其实很简单。多态就是指方法的重写,定义一个父类(接口),各个子类不同,但必须有接口所定义的方法,因此,这些应用统一接口的类就都有接口中定义的规范,这样就满足了接口所定的要求。

对象串行化(序列化)

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();

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:81
帖子:4969
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP