Пропустив разговор о том, что обычно вам не следует этого делать, вы можете достичь того, чего хотите, используя магические функции PHP __get
и __set
.
class MyClass {
// add one member var that holds all the data
private $myMagicData = array();
private $another_var;
function __construct($data){
$this->example = $data; // this will auto-call the __set function
$this->another_var = $data; // this won't, since $this->another_var was declared above
}
function __get($name) {
return array_key_exists($name, $this->myMagicData) ? $this->myMagicData[$name] : null;
}
function __set($name, $value) {
$this->myMagicData[$name] = $value;
}
function exampleFunction(){
$test = $this->example; // this will auto-call the __get function
$another_test = $this->another_var; // this won't
}
}
Документация по этим и другим магическим функциям.
Почему вы не должны этого делать.
По моему мнению, использование волшебных функций __get
и __set
способствует плохой практике программирования. Позвольте мне продемонстрировать на известном примере: если стакан наполовину заполнен, стакан наполовину полон или наполовину пуст? Правильный ответ с точки зрения программиста: стекло слишком большое . Под этим я подразумеваю, что когда вы добавляете магические функции, как показано выше, вы можете просто продолжать присваивать переменные, и это не заботится, но необходимы ли они?
Со временем ваш код изменится, и вам больше не понадобятся старые переменные, которые были ранее назначены. Обычно вы просто удаляете объявление переменной, то есть ваш класс теперь будет потреблять меньше (ненужной) памяти. Если вы забыли удалить одно из старых заданий, вы узнаете об этом достаточно скоро. С помощью функции волшебной функции, как вы будете отслеживать, какие переменные вам нужны, а какие нет?
Помните, что код должен быть написан в первую очередь для того, чтобы люди могли его прочитать, и только во вторую очередь, чтобы машины выполнялись. Если к вам присоединится второй человек, и он задается вопросом, к каким переменным он имеет доступ в представлении, ему придется либо пройти через код, присваивающий переменные, либо print_r($this->myMagicData)
, чем просто смотреть на раздел класса, переменные объявлены.
И, конечно же, есть дополнительные издержки при вызове магических функций, что может или не может быть проблемой в зависимости от ситуации.
Итак, подведем итог: ручное объявление необходимых вам переменных поможет:
- Отслеживайте, какие данные вы используете и не используете
- Облегчает чтение вашего кода как для вас, так и для других
- Выполняется быстрее
Надеюсь, это поможет!