php語言

當前位置 /首頁/計算機/php語言/列表

PHP物件導向的魔術方法詳解

PHP是一種通用開源指令碼語言。本篇文章主要介紹了淺談PHP中的物件導向OOP中的魔術方法 ,具有一定的參考價值,感興趣的小夥伴們可以參考一下!

PHP物件導向的魔術方法詳解

  一、什麼是魔術方法:

PHP為我們提供了一系列用__開頭的函式,這些函式無需自己手動呼叫,會在合適的時機自動呼叫,這類函式稱為魔術函式。

例如:

function __construct(){} 在new一個新物件時自動呼叫此函式

  二、PHP中都有那些魔術方法,以及它們的作用:

1.__construct():建構函式,new物件時自動呼叫

eg:

1

2

3

4

5

6

7

8

9

class Person{

public $name;

public $age;

function __construct($name,$age){

$this->name=$name;

$this->age=$age;

}

}

在new新的Person物件時會自動呼叫__construct()函式,將傳入的引數分別賦給$name,$age。

2.__destruct():解構函式,當一個物件被銷燬前自動呼叫

1

2

3

4

5

6

7

8

class Person{

public $name;

public $age;

function __destruct(){

echo "這個物件被銷燬了";

}

}

同上所述,物件被銷燬時執行此魔術方法

3.__get():訪問類中私有屬性時自動呼叫,傳遞讀取屬性名,返回$this->屬性名

1

2

3

4

5

6

7

8

class Person{

private $name;

public $age;

function __get($name){

return $this->$name;

}

}

如上程式碼,$name被設為私有屬性後不能直接通過$this->name;的方式讀取,因此需要設定__get()魔術方法來讀取。

4.__set():給類的私有屬性賦值時自動呼叫,傳遞需設定的屬性名,屬性值

1

2

3

4

5

6

7

8

class Person{

private $name;

public $age;

function __set($key,$value){

$this->$key=$value;

}

}

同__get()方法,私有屬性不能通過$this->name="aaa";的方式直接設定,需要設定__set()方法,傳入的引數分別是屬性名和屬性值。

5.__isset():使用isset檢測物件私有屬性時呼叫,傳遞檢測的屬性名,返回isset($this->屬性名)

1

2

3

4

5

6

7

8

class Person{

private $name;

public $age;

function __isset($name){

return isset($this->$name);

}

}

使用isset檢測物件私有屬性時呼叫,其他同上。

6.__unset():使用unset()函式刪除物件私有屬性時呼叫,傳遞刪除的屬性名,方法中執行unset($this->屬性名)

1

2

3

4

5

6

7

8

class Person{

private $name;

public $age;

function __unset($name){

unset($this->$name);

}

}

同上,在用unset()函式刪除私有屬性時呼叫。

7.__toString():使用echo列印物件時呼叫,返回列印物件時想要顯示的內容,返回必須是字串

1

2

3

4

5

6

7

8

9

10

11

12

13

class Person{

public $name;

public $age;

function __toString(){

$str = <<<str

您要列印的`內容是:<br>

$name=>{$this->name};<br>

$age=>{$this->age};<br>

str;

return $str;

}

}

使用echo列印物件時呼叫,返回列印物件時想要顯示的內容。

8.__call():呼叫一個類中未定義的或未公開的方法時自動呼叫,傳遞被呼叫的函式名及引數列表

1

2

3

4

5

6

7

8

9

10

11

12

class Person{

public $name;

public $age;

function __call($funcName,$funcParams){

echo "您呼叫的函式{$funcName},引數列表";

print_r($funcParams);

echo "不存在/未公開";

}

}

$zhangsan=new Person();

$zhangsan->say(1,2,3);

如程式碼所示,呼叫不存在的say(1,2,3);時,會列印

您呼叫的函式way,引數列表Array ( [0] => 123 ) 不存在

9.__clone():當使用clone關鍵字,克隆一個物件時自動呼叫,作用是為新克隆的物件初始化賦值

1

2

3

4

5

6

7

8

9

10

11

class Person{

public $name;

public $age;

function __clone(){

$this->name="lisi";

}

}

$zhangsan=new Person("zhangsan",24);

$lisi=clone $zhangsan;

echo $lisi->name;

打印出的結果是"lisi",而不是"zhangsan"。

10.__sleep():物件序列化時自動呼叫,返回一個數組,陣列中的值就是可以序列化的屬性

1

2

3

4

5

6

7

8

class Person{

public $name;

public $age;

function __sleep(){

return array("name","age");

}

}

如上述程式碼,在用serialize()序列化物件時只有"name","age"屬性會被序列化。

11.__wakeup():物件反序列化時自動呼叫,為反序列化新產生的物件進行初始化賦值

1

2

3

4

5

6

7

8

class Person{

public $name;

public $age;

function __wakeup(){

$this -> name = "lisi";

}

}

將物件序列化後再反序列化,同時給物件的name屬性賦初值為"lisi"。

12.__autolode():需要在類外部宣告函式,當例項化一個未宣告的類時自動呼叫,傳遞例項化的類名,可以使用類名自動載入對應的類檔案。

1

2

3

4

5

6

function __autoload($className){

include "class/"olower($className)."";

}

$zhangsan=new Person();

$zhangsan->say();

如上述程式碼,Person類不存在時呼叫__autolode()方法,載入寫在檔案外的類,"class/"olower($className)."";就是類檔案的相對路徑,$className就是

不在本檔案中的類的類名,因此在建立外部類檔案時命名方式必須是小寫的類名。__autolode()方法也是惟一一個不用寫在類中的魔術方法。

TAG標籤:物件導向 PHP #