首頁  >  文章  >  後端開發  >  php物件導向全攻略__toString()用法克隆物件__call處理呼叫錯誤

php物件導向全攻略__toString()用法克隆物件__call處理呼叫錯誤

高洛峰
高洛峰原創
2017-01-06 10:23:071384瀏覽

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(&#39;Hello&#39;); 
//直接输出对象 
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物件導向全攻略__toString()用法克隆物件__call處理調用錯誤相關文章請關注PHP中文網!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn