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


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的错误信息
在WIN200和WIN98下Tomcat服务器安装实例
很全的显示阴历(农历)日期的js代码
用php发送带附件的Email
多域控制器环境下Active Directory灾难恢复
关闭系统服务导致Windows XP系统无法识别移动硬盘
在GridView中LinkButton的属性的应用(如何不用选中就删除这一行)
ControlJS优化阿里妈妈广告提高页面脚本的加载速度
菜鸟javascript基础资料整理3 正则
有关FreeBSD的汉化与使用
在XP和Windows Server 2003使用凭据管理中
表单的一些基本用法与技巧
input之怎么清除默认值
让你的网站首页自动选择语言转跳
快速导航
PHP MySQL HTML CSS JavaScript MSSQL AJAX .NET JSP Linux Mac ASP 服务器 SQL jQuery C# C++ java Android IOS oracle MongoDB SQLite wamp 交通频道 作文范文 无法遏制的性幻想 小学六年级作文1000字:我的梦——读《讲公德守法纪》 有礼貌的小公鸡 2016年农业局上半年工作总结及下半年工作要点报告 内心的阳光 无尽等待 无论怎么努力还是无法忘记你 小学四年级作文650字:“小气”的王老师 中职教育明年扩招100万 四年级班级德育工作总结 心海里的那朵浪花作文700字 安静如我,平凡如你 全县农村文化建设调研报告 同学录作文600字 履行基础教育工作职责述职报告 过去的故事,一件后悔的事作文600字 又是一年清明节精选5篇 我愿我是一朵云作文400字 追忆似水年华作文900字 思念不重,像一整个秋天的落叶 关于描写青春梦想的初中作文_为梦想高歌 夜下的紫藤萝架作文 简析少数民族贫困生心理贫困的主要表现 企业金融服务方案 一杯酒一滴泪 妈妈找工作作文700字 疼是别人给的,伤是自己好的_经典语录 什么才是真正的经典语句,句句都是真理 放假的作文300字 遥忆 小学五年级作文300字:背书卡壳 统计系统法制宣传教育先进个人事迹材料 八一建军节座谈会主持词 东吴醉音仙子 感谢的话 你需要学会的职场社交 海的女儿教学反思 三万活动会议纪要:方案交流 纸和笔 山亭宴(湖亭宴别) 终身难忘的美丽风景 高中中考作文650字:蒲公英 追求梦想作文 高一优秀入团申请书200字 爱有天意作文550字 调查问卷的构成 重阳节快乐(藏头诗) 全球化时代中国服务贸易探讨 人教版八年级下册四单元作文:我家乡的“食节”作文600字 雨季施工方案

Copyright © 2016 phpStudy |