【慕课笔记】PHP面向对象编程——特殊实践(DAY 4)
来源:互联网 发布:无间道天台对白 知乎 编辑:程序博客网 时间:2024/05/16 08:24
面向对象特殊实践
(只有在PHP里面才有,其他语言面向对象没有)
面向对象--魔术方法
__construct(), __destruct() 构造函数和析构函数
__tostring()
__invoke()
__call(), __callStatic()
__get(), __set(), __isset(), __unset()
__clone()
__tostring()
当对象被当作String使用时,这个方法会被自动调用。
Echo $obj;
__invoke()
当对象被当成方法调用时,这个方法会被自动调用
Output:
Getting the property className
Setting the property className to value MagicClassX
__isset invoked
$obj->name is set?1 //如果return为true的话,结果显示为1;如果return为false的话,结果显示为空
__isset invoked
$obj->name is empty? //如果return为true的话,结果显示为空;如果return为false的话,结果显示为1
unsetting property className
output:
James
Before set up: James2's: TBD
James's: James
James's: James2 //James2的数据不会影响James的数据
-------------------------------------------------------------------------------PHP面向对象编程笔记就此完毕---------------------------------------------------------------------------------------
(只有在PHP里面才有,其他语言面向对象没有)
面向对象--魔术方法
__construct(), __destruct() 构造函数和析构函数
__tostring()
__invoke()
__call(), __callStatic()
__get(), __set(), __isset(), __unset()
__clone()
__tostring()
当对象被当作String使用时,这个方法会被自动调用。
Echo $obj;
__invoke()
当对象被当成方法调用时,这个方法会被自动调用
$obj(4);
<?phpclass MagicTest{//__tostring会在把对象转换为string的时候自动调用public function __tostring(){return "This is the Class MagicTest. ";}// __invoke会在把对象当作一个方法调用的时候自动调用public function __invoke($x){echo "__invoke called with parameter ".$x."\n";}}$obj = new MagicTest();echo $obj."\n";$obj(5);?>
output:
This is the Class MagicTest.
__invoke called with parameter 5
__call()
当对象访问不存在的方法名称时,__call()方法会被自动调用
__callStatic()
当对象访问不存在的静态方法名称时,__callStatic()方法会被自动调用
这两个方法在PHP里面也被成为方法的重载(overloading)
注意区分重写(overwrite)
通过这两个方法,同一个方法的名称的调用可以对应不同的方法实现
<?phpclass MagicTest{public function __tostring(){return "This is the Class MagicTest. ";}public function __invoke($x){echo "__invoke called with parameter ".$x."\n";}//方法的重载//这个方法的参数第一个就是调用的方法的名称,第二个参数是方法调用的参数组成的数组public function __call($name,$arguments){echo "Calling " . $name . " with parameters: ".implode(",", $arguments)."\n";}//静态方法的重载,注意这个方法需要设定为staticpublic static function __callStatic($name,$arguments){echo "Static Calling " . $name . " with parameters: ".implode(",", $arguments)."\n";}}$obj = new MagicTest();//runTest这两个方法的名称本来不能完全相同,但是通过魔术方法,可以调用了$obj->runTest("para1","para2"); //没有声明这个runTest方法,因为有__call这个魔术方法,也可以被调用MagicTest::runTest("para1","para2"); //没有声明这个runTest方法,因为有__callStatic这个魔术方法,也可以被调用?>
Output:
Calling runTest with parameters: para1,para2
Static Calling runTest with parameters: para1,para2
__get(), __set(), __isset(), __unset()
在给不可访问属性赋值时,__set()会被调用
读取不可访问属性的值时,__get()会被调用
当对不可访问属性调用isset()或empty()时,__isset()会被调用
当对不可访问属性调用unset()时,__unset()会被调用
所谓不可访问属性,实际上就是在调用某个属性是发现这个属性没有被定义,这时候不同的操纵会触发不同的魔术方法
这几个方法也被称为属性重载的魔术方法
<?phpclass MagicTest{public function __tostring(){return "This is the Class MagicTest. ";}public function __invoke($x){echo "__invoke called with parameter ".$x."\n";}//方法的重载//这个方法的参数第一个就是调用的方法的名称,第二个参数是方法调用的参数组成的数组public function __call($name,$arguments){echo "Calling " . $name . "with parameters: ".implode(",", $arguments)."\n";}//静态方法的重载,注意这个方法需要设定为staticpublic static function __callStatic($name,$arguments){echo "Static Calling " . $name . "with parameters: ".implode(",", $arguments)."\n";}//属性重载public function __get($name){return "Getting the property ".$name."\n";}public function __set($name, $value){echo "Setting the property ".$name." to value " . $value."\n";}public function __isset($name){echo "__isset invoked\n";return true;}public function __unset($name){echo "unsetting property ".$name."\n";}}$obj = new MagicTest();echo $obj->className."\n"; //className未定义,但是通过魔术方法__get,这个方法好像被定义了一样$obj->className='MagicClassX'; //通过魔术方法__get将className名称定义为MagicClassXecho '$obj->name is set?'.isset($obj->className)."\n";echo '$obj->name is empty?'.empty($obj->className)."\n";unset($obj->className);?>
Output:
Getting the property className
Setting the property className to value MagicClassX
__isset invoked
$obj->name is set?1 //如果return为true的话,结果显示为1;如果return为false的话,结果显示为空
__isset invoked
$obj->name is empty? //如果return为true的话,结果显示为空;如果return为false的话,结果显示为1
unsetting property className
面向对象--魔术方法
__clone()
<?phpclass NbaPLayer{public $name;function __clone(){$this->name='TBD'; //屏蔽你不想要他复制过去的数据,屏蔽掉他的数据,设置他的初始值}}$james = new NbaPlayer();$james->name = 'James';echo $james->name."\n";$james2 = clone $james;echo "Before set up: James2's: ".$james2->name."\n";$james2->name='James2';echo "James's: ".$james->name;echo "James's: ".$james2->name;?>
output:
James
Before set up: James2's: TBD
James's: James
James's: James2 //James2的数据不会影响James的数据
-------------------------------------------------------------------------------PHP面向对象编程笔记就此完毕---------------------------------------------------------------------------------------
0 0
- 【慕课笔记】PHP面向对象编程——特殊实践(DAY 4)
- 【慕课笔记】PHP面向对象编程——基本实践(DAY 2)
- 【慕课笔记】PHP面向对象编程——高级实践(DAY 3)
- 【慕课笔记】PHP面向对象编程——面向对象的基本概念(DAY 1)
- PHP面向对象编程 面向对象的特殊实践
- PHP学习笔记——面向对象编程
- PHP面向对象编程-笔记
- PHP面向对象编程 面向对象的基本实践
- PHP面向对象编程 面向对象的高级实践
- 深入PHP面向对象、模式与实践——让面向对象编程更加灵活的模式(2)
- 深入PHP面向对象、模式与实践——让面向对象编程更加灵活的模式(3)
- 深入PHP面向对象、模式与实践——对象
- 【学习笔记】《深入PHP - 面向对象、模式与实践》(第3版)——第4章 高级特性
- php面向对象编程--学习笔记
- php面向对象编程示例学习笔记
- php面向对象编程笔记(1)
- PHP——面向对象(笔记)
- php面向对象笔记(—)
- MySQL:远程访问权限,is not allowed to connect to this MySQL server
- MYSQL查询优化:数据类型与效率
- 唐巧
- 【jQuery应用】5秒后释放button键,position的relative和absolute心得
- How-to: use spark to suport query across mysql tables and hbase tables
- 【慕课笔记】PHP面向对象编程——特殊实践(DAY 4)
- MYSQL查询优化:调度和锁定
- Android四舍五入保留两位小数
- MYSQL查询优化:管理员的优化措施
- js之DOM操作中获取属性方法
- cf C. A Problem about Polyline (数学题)
- (八) HTTP/2的各种帧定义
- 解决maven不能打包的问题
- 浅谈Java GC机制