php魔术方法详解
2016-08-13 09:44
435 查看
__autoload
很多开发者写面向对象的应用程序时,对每个类的定义建立一个 PHP 源文件。一个很大的烦恼是不得不在每个脚本(每个类一个文件)开头写一个长长的包含文件的列表。 在软件开发的系统中,不可能把所有的类都写在一个PHP文件中,当在一个PHP文件中需要调用另一个文件中声明的类时,就需要通过include把这个文件引入。不过有的时候,在文件众多的项目中,要一一将所需类的文件都include进来,是一个很让人头疼的事,所以我们能不能在用到什么类的时候,再把这个类所在的php文件导入呢?这就是我们这里我们要讲的自动加载类。 在 PHP 5 中,可以定义一个 __autoload()函数,它会在试图使用尚未被定义的类时自动调用,通过调用此函数,脚本引擎在 PHP 出错失败前有了最后一个机会加载所需的类, __autoload()函数接收的一个参数,就是你想加载的类的类名,所以你做项目时,在组织定义类的文件名时,需要按照一定的规则,最好以类名为中心,也可以加上统一的前缀或后缀形成文件名,比如xxx_classname.php、classname_xxx.php以及就是classname.php等等. 本例尝试分别从 MyClass1.php 和 MyClass2.php 文件中加载 MyClass1 和 MyClass2 类 <?php function __autoload($classname) { require_once $classname . '.php'; } //MyClass1类不存在自动调用__autoload()函数,传入参数”MyClass1” $obj = new MyClass1(); //MyClass2类不存在自动调用__autoload()函数,传入参数”MyClass2” $obj2 = new MyClass2(); ?>
__call()
<?php header("content-type:text/html;charset='utf-8'"); /* __call处理调用错误 在程序开发中,如果在使用对象调用对象内部方法时候,调用的这个方法不存在那么程序就会出错, 然后程序退出不能继续执行。那么可不可以在程序调用对象内部不存在的方法时,提示我们调用的方法及使用的参数不存在, 但程序还可以继续执行,这个时候我们就要使用在调用不存在的方法时自动调用的方法”__call()”. “__call()”方法,这个方法有2个参数,第一个参数为调用不存在的方法过程中,自动调用__call()方法时, 把这个不存在的方法的方法名传给第一个参数,第二个参数则是把这个方法的多个参数以数组的形式传进来。 */ class Test { //调用不存的方法时自动调用的方法,第一个参数为方法名,第二个参数是数组参数 function __call($function_name, $args) { print "你所调用的函数:$function_name(参数:"; print_r($args); print ")不存在!<br />"; } } //产生一个Test类的对象 $test=new Test(); //调用对象里不存在的方法 $test->demo("one", "two", "three");
__clone()
<?php header("content-type:text/html;charset='utf-8'"); /*克隆对象 有的时候我们需要在一个项目里面,使用两个或多个一样的对象,如果你使用“new”关键字重新创建对象的话,再赋值上相同的属性, 这样做比较烦琐而且也容易出错,所以要根据一个对象完全克隆出一个一模一样的对象,是非常有必要的,而且克隆以后,两个对象互不干扰。 */ class Person { //下面是人的成员属性 public $name; public $sex; public $age; //定义一个构造方法参数为属性姓名$name、性别$sex和年龄$age进行赋值 function __construct($name,$sex,$age) { $this->name=$name; $this->sex=$sex; $this->age=$age; } //这个人可以说话的方法, 说出自己的属性 function say() { echo "我的名子叫:".$this->name." 性别:".$this->sex." 我的年龄是:".$this->age."<br>"; } //对象克隆时自动调用的方法, 如果想在克隆后改变原对象的内容,需要在__clone()中重写原本的属性和方法 function __clone() { //$this指的复本p2, 而$that是指向原本p1,这样就在本方法里,改变了复本的属性。 $this->name="我是假的"; //$this->name="我是假的$that->name"; $this->age=30; } /* public function __clone() { #复制方法,可在里面定义再clone是进行的操作 $this->id = 0; $this->account = clone $this->account; #不加这一句,account在clone是会只被复制引用,其中一个account的balance被修改另一个也同样会被修改 } */ } $p1=new Person("张三", "男", 20); $p2=clone $p1; $p1->say(); $p2->say(); /* 上例输出: 我的名子叫:张三 性别:男 我的年龄是:20 我的名子叫:我是假的张三 性别:男 我的年龄是:30 */
__toString()方法
<?php header("content-type:text/html;charset='utf-8'"); /* 定义了“__toString()”方法,在直接输出对象引用的时候,就不会产生错误,而是自动调用了”__toString()”方法, 输出“__toString()”方法中返回的字符,所以“__toString()”方法一定要有个返回值(return 语句). 当我们有了__toString()时,运行程序是不会报错,会给出一个友好的提示,或者说当我们输出实例化的对象时 会运行__toString()方法,里面运行什么我们自己定义。 */ class TestClass { public $foo; public function __construct($foo) { $this->foo = $foo; } //定义一个__toString方法,返加一个成员属性$foo public function __toString() { return $this->foo; } } $class = new TestClass('Hello'); //直接输出对象 echo $class; //如果没有__toString方法,对象是不可以被输出的,只能被打印 //Catchable fatal error: Object of class Person could not be converted to string //类Person对象不能转换为字符串 //print_r($class);
相关文章推荐
- PHP 魔术方法__set() __get() 方法详解
- php 魔术方法详解
- PHP之十六个魔术方法详解 (一)
- PHP 魔术方法__set() __get() 方法详解
- PHP之十六个魔术方法详解
- PHP 中 16 个魔术方法详解
- PHP中十六个魔术方法详解
- 详解php的魔术方法__get()和__set()使用介绍
- PHP 中 16 个魔术方法详解
- PHP中的魔术方法详解
- PHP 中 16 个魔术方法详解
- PHP 魔术方法详解
- php常见的魔术方法详解
- 详解php魔术方法(Magic methods)的使用方法
- 详解php的魔术方法__get()和__set()使用介绍
- PHP之十六个魔术方法详解
- PHP 中 16 个魔术方法详解
- php常见的魔术方法详解
- 详解php的魔术方法__get()和__set()
- php 魔术方法详解