oop — 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

Решение

Ваш объект не имеет streetaddress свойство, поэтому магический метод __set вызывается при попытке установить его $this->streetaddress = $maybenumber;,

Магические методы: http://php.net/manual/en/language.oop5.magic.php

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]