您現在的位置是:首頁 > 網路遊戲首頁網路遊戲
「php面試」php魔法函式與魔法變數詳解及例項使用教程
- 2022-01-06
獲取屬性返回值的型別是什麼
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()
例項化一個物件時,如果對應的類不存在,則該方法被呼叫。
魔術常量
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 新加)。返回該方法被定義時的名字(區分大小寫)。