2014-09-25 76 views
0

我有:PHP __set()重载方法意外行为

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为空。

对此行为的任何解释都会有所帮助,并且官方文档的链接也会很好。

+0

附加debug_print_backtrace();以__set并查看结果)...地址 - > __设置(streetaddress,441b贝克街)在[... – Cheery 2014-09-25 01:15:45

回答

1

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

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

+0

嗯好的。可以说我没有定义__set方法。那么属性$ streetaddress会自动创建并设置?这是默认的__set方法如何工作? – 2014-09-25 01:20:51

+1

这是正确的先生。 – Weltschmerz 2014-09-25 01:22:26

+1

@bboy,一个更正:没有默认的__set方法。 – sectus 2014-09-25 01:27:42