PHP面向對象的魔術方法詳解
PHP是一種通用開源腳本語言。本篇文章主要介紹了淺談PHP中的面向對象OOP中的魔術方法 ,具有一定的參考價值,感興趣的小夥伴們可以參考一下!
一、什麼是魔術方法:
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()方法也是惟一一個不用寫在類中的魔術方法。
-
PHP編程常用技巧四則
PHP具有非常強大的功能,所有的CGI的功能PHP都能實現。下面就來和小編一起看看PHP編程常用技巧四則吧。1.配置PHP文件目錄作為服務器端解釋執行的腳本語言,PHP程序放置在某個服務器可以訪問的目錄下,一般可以通過修改Apache的進行配置,例如我們在該文件中的一句:Ali...
-
在PHP中使用隨機數的三個步驟
如何做一個隨機的出現的網頁,可是用rand()就是不行,聽説要初始化隨機數,可是怎麼初始化,請不吝賜教,謝謝!//第一步:初始化種子$seedarray=microtime();$seedstr=split("",$seedarray,5);$seed=$seedstr[0]*10000;//第二步:使用種子初始化隨機數發生器srand($seed);//...
-
作為程序員必知的16個最佳PHP庫
PHP是一種功能強大的web站點腳本語言,通過PHP,web網站開發者可以更容易地創建動態的引人入勝的web頁面。開發人員可以使用PHP代碼與一些網站模板和框架來提升功能和特性。然而,編寫PHP代碼是一個繁瑣又耗時的過程。為了縮短開發時間,開發人員可以用PHP庫替代編寫代...
-
tp搜索時首頁分頁和搜索頁保持條件分頁的方法
在做搜索查詢時突然發現在首頁用的`分頁代碼在搜索頁使用時出現錯誤,首頁分頁代碼(代碼中標註start與end部分為分頁代碼),下面是由本站小編為大家整理的Thinkphp搜索時首頁分頁和搜索頁保持條件分頁的方法,喜歡的可以收藏一下!瞭解更多詳情資訊,請關注應屆畢業生...