У вас должны быть методы установки / получения. Они - боль, но вам не обязательно писать их самим. IDE (например, Eclipse или Netbeans) может генерировать их для вас автоматически, если вы предоставляете члена класса. Если, однако, вы вообще не хотите иметь дело с этим и используете PHP5, вы можете использовать его магические методы для решения этой проблемы:
protected $_data=array();
public function __call($method, $args) {
switch (substr($method, 0, 3)) {
case 'get' :
$key = strtolower(substr($method,3));
$data = $this->_data[$key];
return $data;
break;
case 'set' :
$key = strtolower(substr($method,3));
$this->_data[$key] = isset($args[0]) ? $args[0] : null;
return $this;
break;
default :
die("Fatal error: Call to undefined function " . $method);
}
}
Этот код будет запускаться каждый раз, когда вы используете несуществующий метод, начиная с set или get. Теперь вы можете устанавливать / получать (и неявно объявлять) переменные следующим образом:
$object->setName('Bob');
$object->setHairColor('green');
echo $object->getName(); //Outputs Bob
echo $object->getHairColor(); //Outputs Green
Нет необходимости объявлять члены или функции установки / получения. Если в будущем вам нужно добавить функциональность в метод set / get, вы просто объявляете его, по существу, переопределяя магический метод.
Также, так как метод setter возвращает $ this, вы можете chain их так:
$object->setName('Bob')
->setHairColor('green')
->setAddress('someplace');
, что облегчает написание и чтение кода.
Единственным недостатком этого подхода является то, что он усложняет распознавание структуры вашего класса. Так как вы по сути объявляете члены и методы во время выполнения, вы должны выгрузить объект во время выполнения, чтобы увидеть, что он содержит, а не читать класс.
Если вашему классу нужно объявить четко определенный интерфейс (потому что это библиотека и / или вы хотите, чтобы phpdoc генерировал документацию API), я настоятельно рекомендую объявлять открытые методы set / get вместе с приведенным выше кодом.