PHP面向对象编程(四)
2016-12-26 11:52
204 查看
四.面向对象中的魔术方法(php中 特有的 )
1._ _tostring()当对象被当做String使用时,这个方法会被自动调用.
echo $obj
2._ _invoke()
当对象被当成方法调用时,这个方法会被自动调用
$obj(4)
class MagicTest{ //__tostring会在把对象转换为string的时候自动调用 public function __tostring(){ return 'This is the Class MagicTest.'; } //__invoke会把对象当做一个方法调用的时候自动调用 public function __invoke($x){ echo '__invoke called with parameter '.$x; } } $obj = new MagicTest(); echo $obj; $obj(5);
3._ _call()
当对象访问不存在的方法名称时,__call()方法会被自动调用
4._ _callStatic()
当对象访问不存在的静态方法名称时,__callStatic()方法会被自动调用
这两个方法在php里面也被称为方法的重载(overloading)
通过这两个方法,同一个方法的名称的调用可以对应不同的方法实现
class MagicTest{ //方法的重载 //这个方法的参数第一个就是调用方法的名称, //第二个参数是方法调用的参数组成的数组. public function __call($name,$arguments){ echo 'Calling '.$name.' with parameters:'.implode(', ',$arguments); } //静态方法的重载,注意这个方法需要设定为static public static function __callStatic(){ echo 'Static calling '.$name.' with parameters:'.implode(', ',$arguments); } } $obj = new MagicTest(); $obj->runTest('para1','para2'); MagicTest::runTest('para1','para2');
5._ _get()
读取不可访问属性的值时,__get()会被调用
6._ _set()
在给不可访问属性赋值时,__set()会被调用
7._ _isset()
当对不可访问属性调用isset()或empty()时,__isset()会被调用
8._ _unset()
当对不可访问属性调用unset()时,__unset()会被调用
所谓不可访问属性,实际上就是在调用某个属性是发现这个属性没有被定义,这时候不同的操作会出发不同的魔术方法
这几个方法也被称为属性重载的魔术方法
class MagicTest{ //属性的重载 public function __get($name){ return 'Getting the property '.$name } public function __set($name,$value){ echo 'Setting the property '.$name.' to value '.$value; } public function __isset($name){ echo '__isset invoked'; return true; } public function __unset($name){ echo 'unsetting property '.$name; } } $obj = new MagicTest(); echo $obj->className; $obj->className = 'MagicClassx'; echo '$obj->className is Set?'.isset($obj->className); echo '$obj->className is empty?'.empty($obj->className); unset($obj->className);
9._ _clone()
当复制对象时,__clone()方法自动调用
class NbaPlayer{ public $name; function __clone(){ $this->name = 'TBD'; } } $james = new NbaPlayer(); $james->name = 'james'; echo $james->name; $james2=clone $james; echo 'Before set up: james2 :'.$james2->name; $james2->name='$james2'; echo 'james :'.$james->name; echo 'james2 :'.$james2->name;
相关文章推荐
- PHP的面向对象编程
- PHP的面向对象编程=继承
- PHP的面向对象编程:开发大型PHP项目的方法(一)
- 用星际快速入门PHP面向对象编程(修订版)
- PHP面向对象编程快速入门(3)
- 用星际快速入门PHP面向对象编程(修订版)
- PHP的面向对象编程:开发大型PHP项目的方法(三)
- 真正面向对象编程:PHP5.01发布
- PHP面向对象编程的快速入门
- PHP中的面向对象编程
- PHP面向对象编程快速入门
- PHP中实现面向对象编程
- PHP面向对象编程快速入门
- PHP 中的面向对象编程:通向大型 PHP 工程的办法
- PHP面向对象编程快速入门
- PHP面向对象编程快速入门
- PHP的面向对象编程
- PHP的面向对象编程:开发大型PHP项目的方法(二)
- PHP面向对象编程快速入门(2)
- 用星际快速入门PHP面向对象编程(修订版)