PHP5魔术方法和魔术变量
PHP5魔术方法魔术函数: 1、__construct() 构造函数 : 实例化对象时被调用, 当__construct和以类名为函数名的构造函数同时存在时,__construct将被调用,另一个不被调用、2、__destruct()析构函数 : 当删除一个对象或对象操作终止时被调用(程序结束后对象就摧毁)、永远都是最后执行的、3、__call() 对象调用某个方法, 若方法存在,则直接调用;若不存在,则会去调用__call函数、4、__get() 读取一个对象的属性时,若属性存在,则直接返回属性值;若不存在,则会调用__get函数、5、__set()设置一个对象的属性时,若属性存在,则直接赋值;若不存在,则会调用__set函数、 6、__toString()打印一个对象的时被调用、如echo $obj;或print $obj;7、__clone()克隆对象时被调用、如:$t=new Test();$t1=clone $t;8、__sleep()serialize之前被调用、若对象比较大,想删减一点东东再序列化,可考虑一下此函数、9、__wakeup()unserialize时被调用,做些对象的初始化工作、10、__isset()检测一个对象的属性是否存在时被调用、如:isset($c->name)、11、__unset()unset一个对象的属性时被调用、如:unset($c->name)、12、__set_state()调用var_export时,被调用、用__set_state的返回值做为var_export的返回值、13、__autoload()实例化一个对象时,如果对应的类不存在,则该方法被调用、魔术常量1、__LINE__返回文件中的当前行号、2、__FILE__返回文件的完整路径和文件名、如果用在包含文件中,则返回包含文件名、自 PHP 4.0.2 起,__FILE__ 总是包含一个绝对路径,而在此之前的版本有时会包含一个相对路径、3、__FUNCTION__返回函数名称(PHP 4.3.0 新加)、自 PHP 5 起本常量返回该函数被定义时的名字(区分大小写)、在 PHP 4 中该值总是小写字母的、4、__CLASS__返回类的名称(PHP 4.3.0 新加)、自 PHP 5 起本常量返回该类被定义时的名字(区分大小写)、在 PHP 4 中该值总是小写字母的、5、__METHOD__返回类的方法名(PHP 5.0.0 新加)、返回该方法被定义时的名字(区分大小写)、(1)初识魔术方法Php5.0发布以来为我们提供了很多面向对象的特性,尤其是为我们提供了好多易用的魔术方法,这些魔术方法可以让我们简化我们的编码,更好的设计我们的系统、今天我们就来认识下php5.0给我们提供的魔术方法、 PHP | 魔术方法 | __toString(),__clone(),__call(),__autoload() 详解__toString()如果我有一个类:class Person{private $name = “”;private $age = 0;function __construct($name = “”, $age = “”){$this->name = $name;$this->age = $age;}function say(){echo “name:”.$this->name.”<br/>”.”age:”.$this->age.”<br/>”; }}现在我去实例化这个类,然后去打印这个实例:$p1 = new person(“liuzy”,20);echo $p1; //直接打印会出错显然这样直接打印对象是会出现错误的,因为对象是引用句柄,不能直接打印、这时,我们可以用到__toString()方法、我们在Person类里加一个__toString()方法:function __toString(){return “I am Person,my name is “.$this->name.”<br/>”;}然后再刷新页面,发现什么了?现在我们明白,__toString()是在直接打印对象时执行的方法,我们可以用该方法打印类的一些相关信息、注意:是两个下划线,方法必须有返回值、__clone()我们知道对象是可以直接赋值的,比如$p2 = $p1; //这里是一个对象有两个引用那么我执行:$p1->say();$p2->say();是都可以执行的,而且效果一样、我们还有一种方法:$p3 = clone $p1; //注意clone是克隆关键字,这里与上面的不同是$p3是一个新的对象、同时我们在类里加入一个方法:function __clone(){$this->name = “我是副本”; //注意:这里的$this是克隆产生的对象本身,不是当前类}然后我们执行:$p3->say();打印出:name:我是副本age:20到这里我们明白,__clone()方法是在克隆对象的时候执行的方法,它的作用是对新克隆出来的副本进行属性初始化等操作、__call()这个方法的主要功能是:在该类的实例调用一个不存在的方法时,执行该__call()方法、注意需要提前在类里声明:function __call($fname,$argus){echo “你调用的方法:”.$fname.”不存在<br/>”;echo “参数是”.print_r($argus);}声明时包含两个参数,第一个参数是string型,是调用的不存在的方法的方法名($fname),第二个参数是array型,是调用的不存在的方法的参数($argus)、__autoload()我们在平时调用一个类的时候,必须要先将该类所在的文件引入(include “xxx.php”),如果我们在一个页里调用的类很多,那么我们不得不使用许多的include “xxx.php”、显然这样很麻烦、__autoload()方法可以帮我们解决这个问题、比如我们将上面的那个Person类所在的文件定义为 Person_class.php ,再新建一个php文件 test.php,编辑内容:function __autoload($calssName){include $className.”_class.php”; //看到这也许你就明白了吧?哈哈}$p = new Person(“mifan”, 22);$p->say();这样执行该test.php页面就不会出现错误了、__autoload()方法是在生命不存在的类时调用的方法,它有一个string类型的参数是声明该不存在类的类名、当然,类文件的命名也是很有讲究的、最好是和类有关系,比如Person_class.php
添加新评论