PHP面向物件中魔術方法使用
一:
PHP為我們提供了一系列用__開頭的函式,這些函式無需自己動手呼叫,會在何時的時機自動呼叫,稱這類函式為魔術函式。
如:
function __construct( ) {} 在new一個新物件時自動呼叫此函式。
二:
1:建構函式__construct()和解構函式_destruct()
在new新的Player物件時會呼叫__construct()函式。物件銷燬前自動呼叫__destruct函式。
程式碼如下:
<?php
class Player{
public $name;
public $age;
function __construct( $name, $age ){
echo "建構函式<br>";
$this->name = $name;
$this->age = $age;
}
function getName( ){
return $this->name;
}
function __destruct( ){
echo "解構函式<br>";
}
}
$player_1 = new Player( "kobe", 36 );
$name = $player_1->getName( );
echo $name;
echo "<br>";
unset($player_1);
echo "end";
?>
執行結果:
2:__get():訪問類中私有屬性時自動呼叫,傳遞讀取屬性名,返回$this->屬性名。
當直接訪問私有成員變數echo $player_1->name;時,會有報錯資訊,顯示不能呼叫name。
使用__get可以訪問私有屬性。
<?php
class Player{
private $name;
function __construct( $name ){
echo "建構函式<br>";
$this->name = $name;
}
function __get( $name ){
return $this->$name;
}
}
$player_1 = new Player( "kobe", 36 );
echo $player_1->name;
echo "<br>";
?>
執行結果如下:
3:__set():給類的私有屬性賦值時呼叫,傳遞需設定的屬性名。屬性值。
當設定私有成員變數$player_1->name = “james”;時,會有報錯資訊。
正確開啟方式是:
<?php
class Player{
private $name;
private $age;
function __construct( $name ){
echo "建構函式<br>";
$this->name = $name;
}
function __set( $key, $value ){
$this->$key = $value;
}
function __get( $name ){
return $this->$name;
}
}
$player_1 = new Player( "kobe", 36 );
$player_1->name = "james";
echo $player_1->name;
echo "<br>";
?>
執行結果如下:
4:__isset():和 __unset():
__isset():檢測物件私有屬性時呼叫,傳遞檢測的屬性名,返回isset($this->屬性名)。
__unset():使用unset函式刪除物件的私有屬性時呼叫,傳遞刪除的屬性名。方法中執行unset($this->屬性名)。
unset私有成員變數時,會有報錯資訊。
程式碼如下:
<?php
class Player{
private $name;
private $age;
function __construct( $name ){
echo "建構函式<br>";
$this->name = $name;
}
function __isset( $key ){
return isset( $this->$key);
}
function __unset( $key ){
unset( $this->$key );
}
}
$player_1 = new Player( "kobe", 36 );
if ( isset($player_1->name) )
echo "name 成員變數存在";
else
echo "name 成員變數不存在";
unset($player_1->name);
echo "<br>";
?>
5:__toString():使用echo列印物件時呼叫,返回列印物件時想要顯示的內容,返回必須是字串。
echo $player_1;時會有報錯資訊。
程式碼如下:
<?php
class Player{
private $name;
function __construct( $name ){
echo "建構函式<br>";
$this->name = $name;
}
function __toString(){
return "顯示物件";
}
}
$player_1 = new Player( "kobe" );
echo $player_1;
echo "<br>";
?>
執行結果:
6:__call():呼叫一個類中未定義的方法或者私有、受保護的方法時自動呼叫__call函式。傳遞被呼叫的函式名及引數列表。
<?php
class Player{
public $name;
function __construct( $name ){
echo "建構函式<br>";
$this->name = $name;
}
private function getName(){
return $this->$name;
}
function __call( $funcName, $funcParams ){
echo "呼叫的函式是$funcName, 引數列表是:";
print_r( $funcParams );
}
}
$player_1 = new Player( "kobe" );
echo $player_1->setName( "james" );
echo "<br>";
echo $player_1->getName();
echo "<br>";
?>
7:__clone():當使用clone關鍵字克隆一個物件時自動呼叫,作用是為新克隆的物件初始化賦值。
<?php
class Player{
public $name;
function __construct( $name ){
echo "建構函式<br>";
$this->name = $name;
}
function __clone( ){
$this->name = "james";
}
}
$player_1 = new Player( "kobe" );
echo $player_1->name . "<br>";
$player_2 = clone $player_1;
echo $player_2->name . "<br>";
echo "<br>";
?>
執行結果如下:
8:__sleep():物件序列化時自動呼叫,返回一個數組,陣列中的值就是可以序列化的屬性。可以定義serialize()序列化時返回的資料。
不使用__sleep時,serialize()返回類中所有的成員變數資料。
使用__sleep之後的程式碼如下:
<?php
class Player{
public $name;
public $age;
public $sex;
function __construct( $name, $age, $sex ){
echo "建構函式<br>";
$this->name = $name;
$this->age = $age;
$this->sex = $sex;
}
function __sleep( ){
return array("name", "sex");
}
}
$player_1 = new Player( "kobe", 35, "male" );
echo serialize($player_1);
?>
執行結果如下:
9:__wakeup():物件反序列化時呼叫,為反序列化新產生的物件進行初始化賦值。
程式碼如下:
<?php
class Player{
public $name;
public $age;
public $sex;
function __construct( $name, $age, $sex ){
echo "建構函式<br>";
$this->name = $name;
$this->age = $age;
$this->sex = $sex;
}
function __wakeup( ){
$this->name = "kobe";
$this->age = 35;
$this->sex = true;
}
}
$player_1 = new Player( "kobe", 22, false );
$temp = serialize($player_1);
$player_2 = unserialize($temp);
var_dump($player_2);
?>
執行結果: