php物件導向全攻略__toString()用法複製對象__call處理調用錯誤

來源:互聯網
上載者:User
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.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.