PHP7魔術方法在實際程式設計中的應用

2021-10-23 22:39:07 字數 3698 閱讀 2719

class person

}$person = new person('gofor',28);

echo $person->name;//直接報錯

echo $person->age;//直接報錯

上面**執行將發生致命錯誤,cannot access private property person::$name

那如何訪問類的私有或保護屬性呢?

方法1:為每個private/protected屬性定義公有方法

class person

public function getname()

public function getage()

}$person = new person('gofor',28);

echo $person->getname();

echo $person->getage();

這時候**正常執行

這種方法需要為每個private/protected屬性定義對應get***方法,**量比較大,且新增private/protected屬性需要新增對應的方法

方法2:使用__get魔術方法

讀取不可訪問(private/protected)的屬性值時自動呼叫__get方法

**實現

class person

//$name為類的屬性名

public function __get($name)

return '屬性'.$name.'不存在';

}}$person = new person('gofor',28);

echo $person->name;//輸出gofor

echo $person->age;//輸出28

這樣呼叫類私有(或保護)屬性,通過__get乙個魔術方法就搞定,比方法1更簡單方便。

同樣,$person->name = 'tom';給訪問受限屬性這樣賦值會報錯。

那如何給訪問受限屬性賦值呢?

同理,方法1:為每個訪問受限屬性新增對應的set***()共有方法

方法2:使用__set魔術方法

__set( $property, $value )    給乙個訪問受限(private/protected)屬性賦值時呼叫

**實現如下:

class person

//$name為類的屬性名

public function __get($name)

return '屬性'.$name.'不存在';

}//$name為類的屬性名,$value為設定的值

public function __set($name, $value)

}$person = new person('gofor',28);

$person->name = 'tom';

$person->age = 29;

echo $person->name;//輸出tom

echo $person->age;//輸出29

__construct 構造方法,當乙個物件被建立時呼叫此方法,可以給類初始化資料,如屬性賦值

**如下:

class person

}

如何防止呼叫類不存在的方法而報錯呢?

使用__call魔術方法

__call( $method, $arg_array ) 當呼叫乙個未定義(包括沒有許可權訪問)的方法是呼叫此方法。其中$method是呼叫的方法名, $arg_array是引數陣列,傳給方法的引數。

**如下

class person

}$person = new person('gofor',28);

$person->say(『hello』);//person類未定義say方法,這時程式會報錯

如何防止呼叫類不存在的方法而報錯呢?使用__call魔術方法可以實現。**如下:

class person

public function __call($name, $arguments)

}$person = new person('gofor',28);

$person->say(『hello』);//person類未定義say方法,這時會呼叫__call正常訪問

上述**執行結果為:

方法:say不存在

array (size=1)

0 => string 'hello' (length=5)

魔術方法__call其中乙個比較熟悉的應用場景就是web開發的mvc模式中,假設控制器呼叫了乙個不存在的方法,那麼只要定義了__call魔術方法就可以友好處理這種情況。

當呼叫類乙個不存在的靜態方法(就是帶有static關鍵字的方法)會呼叫__callstatic的魔術方法

它的工作方式類似於 __call() 魔術方法,不做詳細描述。

__tostring方法在將乙個物件轉化成字串時自動呼叫,比如使用echo列印物件時,如果類沒有實現此方法,則無法通過echo列印物件

$person = new person('gofor',28);

echo $person;

在沒有給person定義__tostring時,會報錯# object of class person could not be converted to string

實現__tostring方法之後,就可以按照我們設定的格式列印$person資訊了

**如下:

class person

public function __tostring()

}$person = new person('gofor',28);

echo $person;

執行結果如下:

name:gofor,age:28

轉殖物件時被呼叫,如下**:

$person = new person('gofor',28);//建立物件

$person2=clone $person;//這裡轉殖物件,會呼叫__clone魔術方法

完整**如下:

class person

public function __tostring()

public function __call($name, $arguments)

//$name為類的屬性名

public function __get($name)

return '屬性'.$name.'不存在';

}//$name為類的屬性名,$value為設定的值

public function __set($name, $value)

public function __clone()

}$person = new person('gofor',28);

$person2 = clone $person;//此處會呼叫__clone方法

執行上述**結果如下:

我被複製了

PHP7中方法的棄用

php7與資料庫連線建立函式方法呼叫 function fun conn sql 呼叫時 sql 查詢語句 result fun conn sql 可使用函式獲取查詢結果並儲存為陣列形式 arry mysqli fetch assoc result 如果需要顯示查詢結果,只需迴圈輸出顯示陣列 arr...

PHP中的魔術方法

php 將所有以 兩個下劃線 開頭的類方法保留為魔術方法。因此,在定義類方法時,除了下述魔術方法外,建議不要以 為字首。construct 構造方法或建構函式 具有建構函式的類會在每次建立新物件時,先呼叫此方法。因此,非常適合在使用物件之前做一些初始化操作。注意 如果子類中定義了建構函式則不會隱式呼...

PHP 中的魔術方法

1.construct 此為構造方法,是物件建立完成後第乙個被物件自動呼叫的方法,通常使用該方法完成一些物件的初始化工作。class person function say function run person1 new person 張三 男 20 person2 new person 李四 女...