class Address {
private $number;
private $street;
public function __construct($maybenumber, $maybestreet = null) {
if(is_null($maybestreet)) {
$this->streetaddress = $maybenumber;
} else {
$this->number = $maybenumber;
$this->street = $maybestreet;
}
}
public function __set($property, $value) {
if($property === "streetaddress") {
if(preg_match("/^(\d+.*?)[\s,]+(.+)$/", $value, $matches)) {
$this->number = $matches[1];
$this->street = $matches[2];
} else {
throw new Exception("unable to parse street address: '{$value}'");
}
}
}
public function __get($property) {
if($property === "streetaddress") {
return $this->number . " " . $this->street;
}
}
}
$address = new Address("441b Bakers Street");
echo "<pre>";
print_r($GLOBALS);
echo "</pre>";
輸出:
...
[address] => Address Object
(
[number:Address:private] => 441b
[street:Address:private] => Bakers Street
)
它是如何的__set
方法被調用和屬性$number
和$street
集合如圖所示,當__set方法甚至沒有從哪裏調用?
我正常的邏輯告訴我,當實例發生的一切,將已經發生的情況是,一個房地產streetaddress
會以來的第二個參數傳遞給$maybenumber
參數的值來創建,$maybestreet
爲空。
對此行爲的任何解釋都會有所幫助,並且官方文檔的鏈接也會很好。
附加debug_print_backtrace();以__set並查看結果)...地址 - > __設置(streetaddress,441b貝克街)在[... – Cheery 2014-09-25 01:15:45