首頁  >  文章  >  後端開發  >  騰訊php程式設計師面試題-15個魔術方法的總結

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

WBOY
WBOY原創
2016-07-25 08:59:19920瀏覽
  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 下一頁尾頁



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