我有:
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方法甚至没有从任何地方调用时,__set
方法是如何被调用的,属性$number
和$street
是如何设置的?
我的正常逻辑告诉我,当实例化发生时,所有发生的事情都是创建属性streetaddress
,并将值传递给$maybenumber
参数,因为第二个参数$maybestreet
为null。
对这种行为的任何解释都会很有帮助,官方文件的链接也会很好。
您的对象没有streetaddress
属性,这就是为什么当您尝试将其设置为$this->streetaddress = $maybenumber;
时会调用魔术方法__set。
神奇的方法:http://php.net/manual/en/language.oop5.magic.php