Перегрузка на помощь!
После некоторых дальнейших исследований выяснилось, что я действительно хотел методы перегрузки PHP . Код по ссылке, которую дал Гордон, и особенно загружаемый пример, который они предлагают, был очень ярким.
(Несмотря на заголовок моего вопроса, я действительно хотел, чтобы объект ответил на неопределенные атрибуты .)
Итак, __get()
и __set()
позволяют вам указать методы, которые будут использоваться для получения и установки атрибутов объекта, и в рамках этих методов вы можете указать объекту, что делать, если такого атрибута не существует. Давайте пока посмотрим на __get()
.
Возвращаясь к моему Dog
примеру, вы можете использовать его так:
class Dog{
// Private attributes, not accessible except through the __get method
private $bark_volume = 'loud';
private $owner_id = '5';
public function __get($name){
// If there's a property by that name, return it
if (isset($this->$name)){
return $this->$name;
}
// If not, let's see if there's an id with a related name;
// if you ask for $this->owner, we'll check for $this->owner_id
$join_id = $name . "_id";
if(isset($this->$join_id)){
// This is pretty useless, but the id could be used
// to do a join query instead
return $this->$join_id;
}
}
}
$Fido = new Dog;
echo $Fido->bark_volume; //outputs 'loud'
echo '<br/>';
echo $Fido->owner; //outputs '5'