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 李四 女...