Я имею:
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
был нулевым
Любые объяснения относительно этого поведения были бы полезны, и ссылки на официальную документацию были бы также хороши.
Ваш объект не имеет streetaddress
свойство, поэтому магический метод __set вызывается при попытке установить его $this->streetaddress = $maybenumber;
,
Магические методы: http://php.net/manual/en/language.oop5.magic.php
Других решений пока нет …