【问题标题】:php __set() overloaded method unexpected behaviorphp __set() 重载方法意外行为
【发布时间】: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


【解决方案1】:

您的对象没有streetaddress 属性,这就是为什么当您尝试设置它$this-&gt;streetaddress = $maybenumber; 时会调用魔术方法__set。

魔法方法:http://php.net/manual/en/language.oop5.magic.php

【讨论】:

  • 嗯好的。假设我没有定义 __set 方法。那么属性 $streetaddress 会被自动创建和设置吗?这就是默认的 __set 方法的工作原理吗?
猜你喜欢
  • 2011-01-03
  • 1970-01-01
  • 2011-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多