2014-09-25 73 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