php__set()重载了方法的意外行为


php __set() overloaded method unexpected behavior

我有:

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