基於PHP5魔術常量與魔術方法的詳解_PHP教程

來源:互聯網
上載者:User
魔術常量:
1。__LINE__
返迴文件中的當前行號。
2。__FILE__
  返迴文件的完整路徑和檔案名稱。如果用在包含檔案中,則返回包含檔案名稱。自PHP4.0.2 起,__FILE__總是包含一個絕對路徑,而在此之前的版本有時會包含一個相對路徑。
3。__FUNCTION__
  返回函數名稱(PHP4.3.0 新加)。自PHP5 起本常量返回該函數被定義時的名字(區分大小寫)。在PHP4 中該值總是小寫字母的。
4。__CLASS__
  返回類的名稱(PHP4.3.0 新加)。自PHP5 起本常量返回該類被定義時的名字(區分大小寫)。在PHP4 中該值總是小寫字母的。
5。__METHOD__
  返回類的方法名(PHP5.0.0 新加)。返回該方法被定義時的名字(區分大小寫)。
魔術函數:
1。__construct()
  建構函式: 執行個體化對象時被調用,
  當__construct和以類名為函數名的建構函式同時存在時,__construct將被調用,另一個不被調用。
4。__get()
  讀取一個對象的屬性時,若屬性存在,則直接返回屬性值;若不存在,則會調用__get函數。
5。__set()
  設定一個對象的屬性時,
  若屬性存在,則直接賦值;
  若不存在,則會調用__set函數。
6。__toString()
  列印一個對象的時被調用。如echo$obj;或print$obj;
7。__clone()
  複製對象時被調用。如:$t=newTest();$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()
  執行個體化一個對象時,如果對應的類不存在,則該方法被調用。

初識魔術方法
Php5.0發布以來為我們提供了很多物件導向的特性,尤其是為我們提供了好多易用的魔術方法,這些魔術方法可以讓我們簡化我們的編碼,更好的設計我們的系統。今天我們就來認識下php5.0給我們提供的魔術方法。
PHP| 魔術方法|__toString(),__clone(),__call(),__autoload() 詳解
__toString()
如果我有一個類:
classPerson
{
private $name = “”;
private $age = 0;
function__construct($name = “”, $age = “”)
{
$this->name =$name;
$this->age = $age;
}
functionsay()
{
echo“name:”.$this->name.”
”.”age:”.$this->age.”
”;
}
}
現在我去執行個體化這個類,然後去列印這個執行個體:
$p1= new person(“liuzy”,20);
echo $p1; //直接列印會出錯
顯然這樣直接列印對象是會出現錯誤的,因為對象是引用控制代碼,不能直接列印。這時,我們可以用到__toString()方法。我們在Person類裡加一個__toString()方法:
function__toString()
{
return “I am Person,my name is“.$this->name.”
”;
}
然後再重新整理頁面,發現什麼了?
現在我們明白,__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.”不存在
”;
echo“參數是”.print_r($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

http://www.bkjia.com/PHPjc/327629.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/327629.htmlTechArticle魔術常量: 1。__LINE__ 返迴文件中的當前行號。 2。__FILE__ 返迴文件的完整路徑和檔案名稱。如果用在包含檔案中,則返回包含檔案名稱。自PH...

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.