騰訊php程式員面試題-15個魔術方法的總結

來源:互聯網
上載者:User
  1. 功能:在當前頁使用類時自動載入該類的檔案

  2. 參數$className 為類的名稱 可自訂

  3. */

  4. function __autoload($className){

  5. $className=strtolower($className);//最好加上這一步,因為類首字母大寫,某些系統區分檔案名稱的大小寫

  6. require("$className.class.php");//載入類檔案 One.class.php Two.class.php與本檔案在同一目錄下

  7. echo '------------------------------
    ';//作為調用時的標記來測試

  8. }

  9. //以下兩個類均未在本檔案中定義

  10. $o=new One();//使用One類,對其初始化

  11. $t=new Two();//使用Two類,對其初始化

  12. ?>

複製代碼

注意這個函數如果需要正常載入,需要將檔案名稱設定成類名(推薦小寫).class.php等類名和檔案名稱有某種關聯才可以,另外如果這個函數出現異常不能被Catch捕獲,將會顯示Fatal Error

2.__construct() 建構函式

在C#和PHP4中建構函式的函數名都是與類名相同,當然PHP5也支援這樣(如果找不到__construct方法後會找函數名與類名相同的作為建構函式),之所以這樣寫的好處是如果我們想更改類的名字,我們就只改類名就可以,不用在更改建構函式的函數名,同時從某種程度上減少了我們出錯的機率,範例程式碼還是簡單寫一下吧!

  1. class PcYoYo{

  2. private $url;

  3. function __construct($url){

  4. $this->url=$url;

  5. }

  6. }

  7. ?>

複製代碼

3.__destruct() 解構函式

__destruct 析構方法,PHP將在對象被銷毀前(即從記憶體中清除前)調用這個方法

預設情況下,PHP僅僅釋放對象屬性所佔用的記憶體並銷毀對象相關的資源.

解構函式允許你在使用一個對象之後執行任意代碼來清除記憶體.

當PHP決定你的指令碼不再與對象相關時,解構函式將被調用.

在一個函數的命名空間內,這會發生在函數return的時候.

對於全域變數,這發生於指令碼結束的時候.如果你想明確地銷毀一個對象,你可以給指向該對象的變數分配任何其它值.通常將變數賦值勤為NULL或者調用unset.

4.__call() 當所調用的成員方法不存在(或者沒有許可權)該類時調用,用於對錯誤後做一些操作或者提示資訊

  1. //初始化一個類

  2. class Person{

  3. private $name;

  4. private $age;

  5. private $sex;

  6. function walk($hour,$minute){

  7. echo "$hour :$minute We will walk
    ";

  8. }

  9. function run(){

  10. }

  11. //使用魔術方法__call

  12. /*****

  13. 功能:在對象調用類中不存在的函數時自動調用,進行一些操作

  14. 參數:$proName 所調用函數名稱 $args 參數數組 $proName ,$args 為自訂的形參可符合自己風格變動,但是這兩個參數的意義是固定的

  15. *****/

  16. function __call($proName,$args){

  17. echo "The $proName doesn't exist! the parameters are";

  18. print_r($args);

  19. echo '
    ';

  20. }

  21. }// the end of class

  22. //執行個體化一個對象

  23. $p=new Person();

  24. //調用Person類中存在的方法

  25. $p->walk(5,39);

  26. //調用Person類中不存在的方法

  27. $p->work();//如果沒有使用魔術方法__call,則程式發生錯誤,錯誤資訊Fatal error: Call to undefined method Person::work() in D:/phpnow/htdocs/holiday/magic__call.php on line 29

  28. //如果使用了魔術方法__call,則在對象調用類中不存在的函數時,__call被自動調用,用來執行某些操作。

  29. ?>

複製代碼

5.__clone()

該函數在對象複製時自動調用,其作用是對複製的副本做一些初始化操作

  1. //初始化一個類

  2. class Computer{

  3. //

  4. public $cpu='intel';

  5. private $monitor;

  6. private $keyboard;

  7. //設定魔術方法__clone()函數

  8. function __clone(){//如果不設定這個魔術方法那麼複製出來的就是一模一樣的,__clone函數和類的建構函式類似都是做一些初始化操作

  9. $this->cpu='AMD';//$this指的是新建立的複製對象

  10. }

  11. //設定解構函式,用來比較=和clone的區別

  12. function __destruct(){

  13. echo '*************************************
    ';

  14. }

  15. }// the end of the class

  16. //執行個體化一個對象

  17. $c1=new Computer();

  18. //使用引用的方法在添加一個引用,因為對象的引用是存放在記憶體中的棧記憶體中,如果按指標的說法,那麼這樣做就是在記憶體中有建立了一個指標指向$c1指向的對象

  19. //我們可以通過條用解構函式判斷出來這樣不是複製了對象

  20. $c2=$c1;

  21. //使用clone方法複製一個對象

  22. $c3=clone $c1;

  23. //輸出兩者的資訊比較

  24. echo $c1->cpu,'
    ';

  25. echo $c3->cpu,'
    ';

  26. ?>

複製代碼

6.__get() 當所對象所調用的成員屬性未聲明或者層級為private或者protected等時,我們可以在這個函數裡進行自己的一些操作

  1. class Person{

  2. private $name;

  3. public $nation;

  4. function __get($para){//必須有一個參數

  5. echo $para.'不存在';

  6. }

  7. }

  8. $p=new Person();

  9. $name=$p->name;//call the __get function

  10. $nation=$p->nation;//never call the __get function

  11. ?>

複製代碼

7.__set() 當所對未聲明或者層級為private或者protected等進行賦值時調用此函數,我們可以在這個函數裡進行自己的一些操作

  1. class Pc{

  2. private $key;

  3. function __set($key,$value){//必須有兩個參數一個是成員屬性,另一個是值

  4. echo '對'.$key.'賦值為'.$value.'失敗';

  5. }

  6. }

  7. $p=new Pc();

  8. $p->key=123;

  9. ?>

複製代碼

1 2 下一頁 尾頁

  • 聯繫我們

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