程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> PHP5魔術方法的調用實例

PHP5魔術方法的調用實例

編輯:關於PHP編程

PHP5魔術方法
 
魔術函數:  
 
1。__construct()
 
  構造函數 : 實例化對象時被調用,
 
  當__construct和以類名為函數名的構造函數同時存在時,__construct將被調用,另一個不被調用。
 
2。__destruct()
 
析構函數 : 當刪除一個對象或對象操作終止時被調用(程序結束後對象就摧毀)。
 
永遠都是最後執行的。
 
3。__call()
 
  對象調用某個方法,
 
  若方法存在,則直接調用;
 
若不存在,則會去調用__call函數。
 
4。__get()
 
  讀取一個對象的屬性時,若屬性存在,則直接返回屬性值;若不存在,則會調用__get函數。
 
  5。__set()
 
  設置一個對象的屬性時,
 
  若屬性存在,則直接賦值;
 
  若不存在,則會調用__set函數。
 
  6。__toString()
 
  打印一個對象的時被調用。如echo $obj;或print $obj;
 
  7。__clone()
 
  克隆對象時被調用。如:$t=new Test();$t1=clone $t;
 
  8。__sleep()
 
  serialize之前被調用。若對象比較大,想刪減一點東東再序列化,可考慮一下此函數。
 
  9。__wakeup()
 
  unserialize時被調用,做些對象的初始化工作。
 
  10。__isset()
 
  檢測一個對象的屬性是否存在時被調用。如:isset($c->name)。
 
  11。__unset()
 
  unset一個對象的屬性時被調用。如:unset($c->name)。
 
  12。__set_state()
 
  調用var_export時,被調用。用__set_state的返回值做為var_export的返回值。
 
  13。__autoload()
 
  實例化一個對象時,如果對應的類不存在,則該方法被調用。
 
  魔術常量
 
  1。__LINE__
 
  返回文件中的當前行號。
 
  2。__FILE__
 
  返回文件的完整路徑和文件名。如果用在包含文件中,則返回包含文件名。自PHP 4.0.2 起,__FILE__ 總是包含一個絕對路徑,而在此之前的版本有時會包含一個相對路徑。
 
  3。__FUNCTION__
 
  返回函數名稱(PHP 4.3.0 新加)。自PHP 5 起本常量返回該函數被定義時的名字(區分大小寫)。在PHP 4 中該值總是小寫字母的。
 
  4。__CLASS__
 
  返回類的名稱(PHP 4.3.0 新加)。自PHP 5 起本常量返回該類被定義時的名字(區分大小寫)。在PHP 4 中該值總是小寫字母的。
 
  5。__METHOD__
 
  返回類的方法名(PHP 5.0.0 新加)。返回該方法被定義時的名字(區分大小寫)。
 
  (1)初識魔術方法
 
  Php5.0發布以來為我們提供了很多面向對象的特性,尤其是為我們提供了好多易用的魔術方法,這些魔術方法可以讓我們簡化我們的編碼,更好的設計我們的系統。今天我們就來認識下php5.0給我們提供的魔術方法。
 
PHP | 魔術方法| __toString(),__clone(),__call(),__autoload() 詳解
 
__toString()
 
如果我有一個類:
 
class Person
 
{
 
private $name = “”;
 
private $age = 0;
 
function __construct($name = “”, $age = “”)
 
{
 
$this->name = $name;
 
$this->age = $age;
 
}
 
function say()
 
{
 
echo “name:”.$this->name.”<br/>”.”age:”.$this->age.”<br/>”;  
 
}
 
}
 
現在我去實例化這個類,然後去打印這個實例:
 
$p1 = new person(“liuzy”,20);
 
echo $p1;  //直接打印會出錯
 
顯然這樣直接打印對象是會出現錯誤的,因為對象是引用句柄,不能直接打印。這時,我們可以用到__toString()方法。我們在Person類裡加一個__toString()方法:
 
function __toString()
 
{
 
return “I am  Person,my name is “.$this->name.”<br/>”;
 
}
 
然後再刷新頁面,發現什麼了?
 
現在我們明白,__toString()是在直接打印對象時執行的方法,我們可以用該方法打印類的一些相關信息。注意:是兩個下劃線,方法必須有返回值。
 
__clone()
 
我們知道對象是可以直接賦值的,比如
 
$p2 = $p1;   //這裡是一個對象有兩個引用
 
那麼我執行:
 
$p1->say();
 
$p2->say();
 
是都可以執行的,而且效果一樣。
 
我們還有一種方法:
 
$p3 = clone $p1;     //注意clone是克隆關鍵字,這裡與上面的不同是$p3是一個新的對象。
 
同時我們在類裡加入一個方法:
 
function __clone()
 
{
 
$this->name = “我是副本”;  //注意:這裡的$this是克隆產生的對象本身,不是當前類
 
}
 
然後我們執行:
 
$p3->say();
 
打印出:
 
name:我是副本
 
age:20
 
到這裡我們明白,__clone()方法是在克隆對象的時候執行的方法,它的作用是對新克隆出來的副本
 
進行屬性初始化等操作。
 
__call()
 
這個方法的主要功能是:在該類的實例調用一個不存在的方法時,執行該__call()方法。注意需要提前在類裡
 
聲明:
 
function __call($fname,$argus)
 
{
 
echo “你調用的方法:”.$fname.”不存在<br/>”;
 
echo “參數是”.print_r($argus);
 
}
 
聲明時包含兩個參數,第一個參數是string型,是調用的不存在的方法的方法名($fname),第二個參數是
 
array型,是調用的不存在的方法的參數($argus)。
 
__autoload()
 
我們在平時調用一個類的時候,必須要先將該類所在的文件引入(include “xxx.php”),如果我們在一個頁裡調用的類很多,那麼我們不得不使用許多的include “xxx.php”。顯然這樣很麻煩。
 
__autoload()方法可以幫我們解決這個問題。
 
比如我們將上面的那個Person類所在的文件定義為Person_class.php  ,
 
再新建一個php文件  test.php,編輯內容:
 
function  __autoload($calssName)
 
{
 
include $className.”_class.php”;  //看到這也許你就明白了吧?哈哈
 
}
 
$p = new Person(“mifan”, 22);
 
$p->say();
 
這樣執行該test.php頁面就不會出現錯誤了。
 
__autoload()方法是在生命不存在的類時調用的方法,它有一個string類型的參數是聲明該不存在類的類名。
 
當然,類文件的命名也是很有講究的。最好是和類有關系,比如Person_class.php
 
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved