1、魔術方法:
/** * @purpose: 魔術方法 __get() , __set(), __isset(), __call, __callStatic, __toString, __invoke 的使用 * User: daicr * Date: 2019/3/4 * Time: 11:10 * * 1、當我們調用一個權限上不允許調用的屬性,和不存在的屬性時,__get魔術方法會自動調用 * * 2、當為無權操作的屬性賦值時,或不存在的屬性賦值時,__set()自動調用 * * 3、當 用isset() 判斷對象不可見的屬性時(protected/private/不存在的屬性),會引發 __isset()來執行 * * 4、當所調用對象的方法不存在時默認調用 __call * * 5、當所調用對象的靜態方法不存在時默認調用 __callStatic * * 6、當一個類或者對象被當做字符串返回時,會調用 __toString 來輸出 * * 7、當嘗試以調用函數的方式調用一個對象時,__invoke() 方法會被自動調用。 */
class Test { /** * @var string 私有屬性,外部方法訪問不了,會默認調用 __get */
private $username = 'daicr'; /** * @var array 存放對象的屬性數組 */
protected $attributes = []; /** * @purpose: 當我們調用一個權限上不允許調用的屬性,和不存在的屬性時,__get魔術方法會自動調用 * @param string $name 屬性名 * @return mixed */
public function __get($name) { if(array_key_exists($name,$this->attributes)){ return $this->attributes[$name]; } } /** * @purpose: 當為無權操作的屬性賦值時,或不存在的屬性賦值時,__set()自動調用 * @param string $name 屬性名 * @param mixed $value 屬性值 */
public function __set($name, $value) { if(property_exists($this,$name)){ $this->$name = $value; }else{ $this->attributes[$name] = $value; } } /** * @purpose: 當 用isset() 判斷對象不可見的屬性時(protected/private/不存在的屬性),會引發 __isset()來執行 * @param string $name 屬性名 * @return bool */
public function __isset($name) { if(isset($this->attributes[$name])){ return true; } } /** * @purpose: 當所調用對象的方法不存在時默認調用 __call * @param string $name 方法名 * @param mixed $arguments 參數 */
public function __call($name, $arguments) { // 注意: $name 的值區分大小寫
echo "對象方法名: '$name' , 參數:" . implode(', ', $arguments). "\n"; } /** * @purpose: 當所調用對象的靜態方法不存在時默認調用 __callStatic * @param string $name 方法名 * @param mixed $arguments 參數 */
public static function __callStatic($name, $arguments) { // 注意: $name 的值區分大小寫
echo "對象靜態方法名: '$name' " . implode(', ', $arguments). "\n"; } /** * @purpose: 當一個類或者對象被當做字符串返回時,會調用 __toString 來輸出 * @return string */
public function __toString() { return __CLASS__; } /** * @purpose: 當嘗試以調用函數的方式調用一個對象時,__invoke() 方法會被自動調用。 */
public function __invoke() { echo 'invoke'; } /** * @purpose: 打印對象屬性數組 */
public function index(){ var_dump($this->attributes); } }
2、調用魔術方法(在另外一個類的方法里面):
public function index() { $testModel = new Test(); // 訪問一個私有屬性,如果沒有__get(),是會報錯的。過程:$testModel->username--沒有權限-->__get('username');
echo $testModel->username; //$testModel沒有age屬性,但是會通過__set()進行賦值
$testModel->age=26; $testModel->index(); //array(1) { ["age"]=> int(26) }
echo $testModel->test('hello'); //"對象方法名: 'test' , 參數:hello
echo $testModel::test( ['hello','world']); //"對象靜態方法名:'test' , 參數:hello //直接輸出對象的時候,會輸出對象名的字符串形式. 輸出值為: Test
echo $testModel; //把類當做方法來使用,會調用__invoke , 輸出值為:invoke.
echo $testModel(); }
此文章為小代在工作中的總結,如有轉載請注明出處:https://www.cnblogs.com/chrdai/