您現在的位置是:首頁 > 網路遊戲首頁網路遊戲

「php面試」php魔法函式與魔法變數詳解及例項使用教程

簡介同理喚醒物件時,php會呼叫__wakeup()方法,但與__sleep()不同的是,它返回值為空

獲取屬性返回值的型別是什麼

php的語法中,有一些系統自帶的方法名,均以雙下劃線開頭,它會在特定的情況下被呼叫。即所謂的魔法函式。

魔術函式

1。__construct()

例項化物件時被呼叫, 當__construct和以類名為函式名的函式同時存在時,__construct將被呼叫,另一個不被呼叫。

2。__destruct()

當刪除一個物件或物件操作終止時被呼叫。

3。__call()

物件呼叫某個方法,

若方法存在,則直接呼叫;

若不存在,則會去呼叫__call函式。

4。__get()

讀取一個物件的屬性時,

若屬性存在,則直接返回屬性值;

若不存在,則會呼叫__get函式。

5。__set()

設定一個物件的屬性時,

若屬性存在,則直接賦值;

若不存在,則會呼叫__set函式。

面向物件程式設計中使用頻率很高的兩個方法。當設定和獲取物件的屬性不允許訪問時性,此方法會被呼叫。一定注意是不存在或不允許被讀寫時才會被呼叫。

因此對於一個物件,其屬性不確定時,用這兩個方法效果很好。

__get($name) 獲取物件不存在的屬性或無法訪問的屬性時呼叫.$name表示要獲取的屬性名

__set($name, $value) 設定物件不存在的屬性或無法訪問的屬性時呼叫.$name表示要設定的屬性名,$value表示要設定的值.

//例如:我們可以構建一個不確定屬性的資料記錄類

class Record {

protected $_data;

public function __get($name)

{

if (isset($this->_data[$name])) {

return $this->_data;

}

return false;

}

public function __set($name, $value)

{

$this->_data = $value;

}

}

$record = new Record();

$record->name = ‘andrew’;

echo ‘My name is ’。$record->name。PHP_EOL;

這兩個方法用得比較少些。當呼叫方法isset()判斷物件是否存在某屬性, 呼叫unset()登出某屬性時。且當這些屬性不存在或不可訪問時,會分別呼叫__isset()和__unset()方法

與前面的

__get()和__set()

略同。都是某屬性不存在或不可訪問時被呼叫

__isset($name) 當呼叫方法isset()方法判斷不可訪問的類屬性時呼叫。$name表示屬性名。

__unset($name) 當呼叫方法unset()方法刪除不可訪問的類屬性時呼叫。$name表示屬性名。

6。__toString()

列印一個物件的時被呼叫。如echo $obj;或print $obj;

classInfo{

publicfunction__toString()

{

return"info";

}

}

$info = new Info();

echo $info.PHP_EOL;

7。__clone()

克隆物件時被呼叫。如:$t=new Test();$t1=clone $t;

8。__sleep()

serialize之前被呼叫。若物件比較大,想刪減一點東東再序列化,可考慮一下此函式。

9。__wakeup()

unserialize時被呼叫,做些物件的初始化工作。

__sleep() 和 __wakeup()

這兩個方法,咋一看,就是睡覺和喚醒嘛。那跟物件有什麼關係?有時候該用的時候也想不起來。其實,我們簡單點記,在php中有一個讓物件睡覺的方法,叫searialize(),

它會將物件的各屬性序列化以方便儲存起來。而unsearialize()方法是將儲存的序列化的資料解開變成物件。也叫喚醒。相對應的,當睡覺時,php會呼叫__sleep()方法,它

的返回值必須是一個數組,表示需要儲存的屬性項, 對於檔案控制代碼,資料庫連線等資源型別的資料是不能被序列化儲存的。同理喚醒物件時,php會呼叫__wakeup()方法,

但與__sleep()不同的是,它返回值為空。被儲存的屬性都會被解開。那它有什麼用呢?剛我們說了,searialize是不能儲存資源的。那麼喚醒時如果我們想用到這些資源怎麼

辦?回答很肯定,重新建立?那在哪裡建立合適呢?當然是__wakeup()方法裡面,因為每次喚醒時都會呼叫此方法嘛。這下我們很清楚這兩個方法的用途了。

__sleep() 當呼叫searialize()方法時呼叫,返回值為陣列,表示需要序列化的資料項.

__wakeup() 當呼叫unsearizlie()方法時呼叫。一般用來在喚醒時初始化資源物件.

//例如我們有一個使用者類,使用者名稱和性別都是類屬性。使用者的密碼存在檔案中

Class User {

public $username;

public $sex;

public $passFile;

private $_password;

public function __construct($username, $sex, $passFile)

{

$this->username = $username;

$this->sex = $sex;

$this->passFile = $passFile;

$this->_password = file_get_contents($passFile);

}

public function getPassword()

{

return $this->_password;

}

public function __sleep()

{

return array(

‘username’, ‘sex’, ‘passFile’,

);

}

public function __wakeup()

{

$this->_password = file_get_contents($this->passFile);

}

}

$user = new User(‘andrew’, ‘male’, ‘pass。data’);

$serializeData = serialize($user);

echo $serializeData。PHP_EOL;

$user = unserialize($serializeData);

echo $user->getPassword()。PHP_EOL;

10。__isset()

檢測一個物件的屬性是否存在時被呼叫。如:isset($c->name)。

11。__unset()

unset一個物件的屬性時被呼叫。如:unset($c->name)。

12。__set_state()

呼叫var_export時,被呼叫。用__set_state的返回值做為var_export的返回值。

13。__autoload()

例項化一個物件時,如果對應的類不存在,則該方法被呼叫。

「php面試」php魔法函式與魔法變數詳解及例項使用教程

魔術常量

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 新加)。返回該方法被定義時的名字(區分大小寫)。

Top