php

位置:IT落伍者 >> php >> 浏览文章

PHP的魔术方法学习


发布日期:2024年03月10日
 
PHP的魔术方法学习

__set_state()
var_export可以把一个集合导出为一串字符串这些字符串是一些可执行的PHP代码在php的面向对象里引入了一个叫__set_state的静态方法来使得var_export支持对象实例的导出当用var_export导出一个实例的时候所导出字符串里是调用这个静态方法的代码这个方法有一个参数为包含所导出的实例的所有成员属性的一个数组有点抽象看下面的例子吧
<?phpclasso{public$skill=’php’;publicstaticfunction__set_state($arr){foreach($arras$k=>$v){$obj>$k=$v;}return$obj;}}$i=newo;$i>age=;eval(’$b=’var_export($itrue)’;’);//这里的true表示var_export返回所导出的字符串而不是把它打印出来print_r($b);/*输出stdClassObject([skill]=>php[age]=>)*/?>

__clone()
在php对象间的赋值总是以地址引用来传递的例如下面这个例子将会输出而不是
<?phpclasso{public$age=;}$i=newo;$i=$i;$i>age=;echo$i>age;?>
如果要以实际值来传递则需要用到clone关键词
<?phpclasso{public$age=;}$i=newo;$i=clone$i;$i>age=;echo$i>age;//输出?>
但是这里clone的只是$i这个实例如果$i的某个成员属性也是个实例那么这个成员属性还是会以引用方法被传递到$i例如下面这个例子
<?phpclasso{public$age=;public$sub=null;}classo{public$p=;}$i=newo;$i>sub=newo;$i=clone$i;$i>sub>p=;echo$i>sub>p;?>
最后输出的是而不是也就是说$i和$i虽然不是指向的虽然不是同一个实例但是它们的成员属性$sub却是指向同一个实例这时候我们必须借助__clone这个方法来对$sub进行复制在o类里加入__clone()方法如下
<?phpclasso{public$age=;public$sub=null;publicfunction__clone(){$this>sub=clone$this>sub;}}//?>
这样在echo$i>sub>p;的时候输出的就是传递时候的值
__autoload()
当创建一个实例化的时候如果对应的类不存在__autoload()将会被执行这个函数有一个参数为所要创建的实例对应的类名在下面的例子里当创建一个test类的实例的时候如果/home/surfchen/project/autophp存在则require这个文件否则打印一个ClasstestNotFound的错误并中止当前脚本

               

上一篇:PHP取二进制文件头快速判断文件类型

下一篇:PHP和ASP对象的等价关系详谈