php面向对象全攻略 (十一)__toString()用法 克隆对象 __call处理调用错误


Posted in PHP onSeptember 30, 2009

16.__toString()方法
我们前面说过在类里面声明“— ”开始的方法名的方法(PHP 给我们提供的),都是在
某一时刻不同情况下自动调用执行的方法,“__toString()”方法也是一样自动被调用的,是在
直接输出对象引用时自动调用的, 前面我们讲过对象引用是一个指针,比如说:“$p=new
Person()”中,$p 就是一个引用,我们不能使用echo 直接输出$p,这样会输出“Catchable fatal
error: Object of class Person could not be converted to string”这样的错误,如果你在类里面定义
了“__toString()”方法,在直接输出对象引用的时候,就不会产生错误,而是自动调用了
“__toString()”方法,输出“__toString()”方法中返回的字符,所以“__toString()”方法一定
要有个返回值(return 语句)。
代码片段

<?php 
// Declare a simple class 
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; 
?>

上例输出:Hello
17.克隆对象
有的时候我们需要在一个项目里面,使用两个或多个一样的对象,如果你使用“new”
关键字重新创建对象的话,再赋值上相同的属性,这样做比较烦琐而且也容易出错,所以要
根据一个对象完全克隆出一个一模一样的对象,是非常有必要的,而且克隆以后,两个对象
互不干扰。
在PHP5 中我们使用“clone”这个关键字克隆对象;
代码片段
<? 
class Person{ 
//下面是人的成员属性 
var $name; //人的名子 
var $sex; //人的性别 
var $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>"; 
} 
} 
$p1=new Person("张三", "男", 20); 
//使用“clone”克隆新对象p2,和p1对象具有相同的属性和方法。 
$p2=clone $p1; 
$p2->say(); 
?>

PHP5 定义了一个特殊的方法名“__clone()”方法,是在对象克隆时自动调用的方法,
用“__clone()”方法将建立一个与原对象拥有相同属性和方法的对象,如果想在克隆后改变
原对象的内容,需要在__clone()中重写原本的属性和方法,“__clone()”方法可以没有参数,
它自动包含$this 和$that 两个指针,$this 指向复本,而$that 指向原本;
代码片段
class Person{ 
//下面是人的成员属性 
var $name; //人的名子 
var $sex; //人的性别 
var $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="我是假的$that->name"; 
$this->age=30; 
} 
} 
$p1=new Person("张三", "男", 20); 
$p2=clone $p1; 
$p1->say(); 
$p2->say(); 
?>

上例输出:
执行结果
我的名子叫:张三性别:男我的年龄是:20
我的名子叫:我是假的张三性别:男我的年龄是:30
18.__call 处理调用错误
在程序开发中,如果在使用对象调用对象内部方法时候,调用的这个方法不存在那么程
序就会出错,然后程序退出不能继续执行。那么可不可以在程序调用对象内部不存在的方法
时,提示我们调用的方法及使用的参数不存在,但程序还可以继续执行,这个时候我们就要
使用在调用不存在的方法时自动调用的方法“__call()”。
代码片段
<?php 
//这是一个测试的类,里面没有属性和方法 
class Test{ 
} 
//产生一个Test类的对象 
$test=new Test(); 
//调用对象里不存在的方法 
$test->demo("one", "two", "three"); 
//程序不会执行到这里 
echo "this is a test<br>"; 
?>

上例出现如下错误,程序通出不能继续执行;
Fatal error: Call to undefined method Test::demo()
下面我们加上“__call()”方法,这个方法有2 个参数,第一个参数为调用不存在的方法
过程中,自动调用__call()方法时,把这个不存在的方法的方法名传给第一个参数,第二个参
数则是把这个方法的多个参数以数组的形式传进来。
代码片段
<?php 
//这是一个测试的类,里面没有属性和方法 
class Test{ 
//调用不存的方法时自动调用的方法,第一个参数为方法名,第二个参数是数组参数 
function __call($function_name, $args){ 
print "你所调用的函数:$function_name(参数:"; 
print_r($args); 
print ")不存在!<br>\n"; 
} 
} 
//产生一个Test类的对象 
$test=new Test(); 
//调用对象里不存在的方法 
$test->demo("one", "two", "three"); 
//程序不会退出可以执行到这里 
echo "this is a test<br>"; 
?>

上例输出结果为:
执行结果
你所调用的函数: demo(参数:Array ( [0] => one [1] => two [2] => three ) )不存在!
this is a test.
PHP 相关文章推荐
PHP调用MsSQL Server 2012存储过程获取多结果集(包含output参数)的详解
Jul 03 PHP
js限制checkbox勾选的个数以及php获取多个checkbbox的方法深入解析
Jul 18 PHP
2个比较经典的PHP加密解密函数分享
Jul 01 PHP
php生成圆角图片的方法
Apr 07 PHP
摘自织梦CMS的HTTP文件下载类
Aug 08 PHP
Zend Framework教程之MVC框架的Controller用法分析
Mar 07 PHP
PHP的Yii框架中移除组件所绑定的行为的方法
Mar 18 PHP
PHP依赖注入(DI)和控制反转(IoC)详解
Jun 12 PHP
php微信公众号开发之微信企业付款给个人
Oct 04 PHP
php实现session共享的实例方法
Sep 19 PHP
PHP 计算至少是其他数字两倍的最大数的实现代码
May 26 PHP
PHP xpath提取网页数据内容代码解析
Jul 16 PHP
php面向对象全攻略 (十) final static const关键字的使用
Sep 30 #PHP
php面向对象全攻略 (九)访问类型
Sep 30 #PHP
php面向对象全攻略 (八)重载新的方法
Sep 30 #PHP
php面向对象全攻略 (七) 继承性
Sep 30 #PHP
php面向对象全攻略 (六)__set() __get() __isset() __unset()的用法
Sep 30 #PHP
php面向对象全攻略 (五) 封装性
Sep 30 #PHP
php面向对象全攻略 (四)构造方法与析构方法
Sep 30 #PHP
You might like
apache+mysql+php+ssl服务器之完全安装攻略
2006/09/05 PHP
SMARTY学习手记
2007/01/04 PHP
PHP用mysql数据库存储session的代码
2010/03/05 PHP
php的sprintf函数的用法 控制浮点数格式
2014/02/14 PHP
php递归json类实例
2014/12/02 PHP
100行PHP代码实现socks5代理服务器
2016/04/28 PHP
PHP实现中国公民身份证号码有效性验证示例代码
2017/05/03 PHP
JScript分割字符串示例代码
2013/09/04 Javascript
Bootstrap Table使用方法详解
2016/08/01 Javascript
javascript入门之window对象【新手必看】
2016/11/22 Javascript
Node 自动化部署的方法
2017/10/17 Javascript
VUE element-ui 写个复用Table组件的示例代码
2017/11/18 Javascript
解决angularJS中input标签的ng-change事件无效问题
2018/09/13 Javascript
详解NodeJS Https HSM双向认证实现
2019/03/12 NodeJs
微信小程序getLocation 需要在app.json中声明permission字段
2020/03/03 Javascript
[56:01]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 Effect vs EG
2018/03/31 DOTA
Python打包文件夹的方法小结(zip,tar,tar.gz等)
2016/09/18 Python
微信跳一跳python自动代码解读1.0
2018/01/12 Python
python 去除txt文本中的空格、数字、特定字母等方法
2018/07/24 Python
Django实现支付宝付款和微信支付的示例代码
2018/07/25 Python
python获取url的返回信息方法
2018/12/17 Python
python 遍历列表提取下标和值的实例
2018/12/25 Python
使用Python来做一个屏幕录制工具的操作代码
2020/01/18 Python
python通过matplotlib生成复合饼图
2020/02/06 Python
Pytorch mask_select 函数的用法详解
2020/02/18 Python
基于python tkinter的点名小程序功能的实例代码
2020/08/22 Python
使用CSS3制作饼状旋转载入效果的实例
2015/06/23 HTML / CSS
HTML5地理定位与第三方工具百度地图的应用
2016/11/17 HTML / CSS
实例教程 利用html5和css3打造一款创意404页面
2014/10/20 HTML / CSS
Nebula美国官网:便携式投影仪
2019/03/15 全球购物
小学运动会广播稿200字(十二篇)
2014/01/14 职场文书
我们的节日端午节活动方案
2014/03/02 职场文书
会计的岗位职责
2014/03/15 职场文书
小学国庆节活动总结
2015/03/23 职场文书
外出学习心得体会范文
2016/01/18 职场文书
SQL Server数据库备份和恢复数据库的全过程
2022/06/14 SQL Server