【发布时间】:2014-09-25 01:07:26
【问题描述】:
我有:
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 方法甚至没有从任何地方调用?
我的正常逻辑告诉我,当实例化发生时,所有会发生的事情是使用传递给$maybenumber 参数的值创建属性streetaddress,因为第二个参数$maybestreet 为空.
对此行为的任何解释都会有所帮助,并且官方文档的链接也很好。
【问题讨论】:
-
添加 debug_print_backtrace();到 __set 并查看结果)... Address->__set(streetaddress, 441b Bakers Street) 在 [...
标签: php oop overloading