Установка переменной в функции класса, где я могу использовать эту переменную - PullRequest
0 голосов
/ 24 июня 2010

Если у меня есть класс (как показано ниже) и в функции я устанавливаю переменную (ниже: $ this-> example), но я не объявляю переменную в верхней части класса (например, var $ example;), где и как я могу использовать эту переменную? Я сразу попытался использовать его в другой функции, но это не сработало (наверное, я мог ошибиться, но сработало после того, как я объявил его в верхней части класса)

Я видел это в Symfony для установки переменных, которые вы можете использовать в представлении, а также я наткнулся на это в Phorms, чтобы назвать пару примеров.

Извините, если это очевидно, я просто хотел бы понять, как я могу использовать эти переменные, в том числе получить имя переменной (например, $ this-> example, по названию я имею в виду "example").

class ExampleClass{
  var $another_var;
  function __construct($data){
    $this->example = $data;
    $this->another_var = $data;
  }

  function exampleFunction(){
    $test = $this->example; //this doesnt work
    $another_test = $this->another_var; //this obviously does
  }
}

Любая помощь будет высоко ценится

Привет

Люк

РЕДАКТИРОВАТЬ: (из моего ответа DrColossus)

Я хочу иметь возможность установить любое имя переменной в функции, а в другой функции получить любые переменные, установленные с таким именем. Например, в Symfony я могу установить $ this-> completetly_random_name = $ x в функции класса действия, затем в представлении я могу использовать $ completetra_random_name. Symfony не может установить каждую возможную комбинацию имен переменных в верхней части родительского класса.

Ответы [ 4 ]

10 голосов
/ 24 июня 2010

Пропустив разговор о том, что обычно вам не следует этого делать, вы можете достичь того, чего хотите, используя магические функции 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), чем просто смотреть на раздел класса, переменные объявлены.

И, конечно же, есть дополнительные издержки при вызове магических функций, что может или не может быть проблемой в зависимости от ситуации.

Итак, подведем итог: ручное объявление необходимых вам переменных поможет:

  1. Отслеживайте, какие данные вы используете и не используете
  2. Облегчает чтение вашего кода как для вас, так и для других
  3. Выполняется быстрее

Надеюсь, это поможет!

2 голосов
/ 24 июня 2010
class ExampleClass{
  private $another_var;
  private $example;

  public function __construct($data){
    $this->example = $data;
    $this->another_var = $data;
  }

  public function getExample() {
    return $this->example;
  }

  public function setExample($example) {
    $this->example = $example;
  }

  public function exampleFunction()
    $test = $this->example; //now that you have a private $example, this will work
    $another_test = $this->another_var; //this obviously does
  }
}

Используйте общедоступные методы получения / установки для доступа к частным переменным.

редактировать Айстина была быстрее меня, его примеры показывают, как вы можете получить / получить доступ к любой переменной.

0 голосов
/ 24 июня 2010

Я не профессионал в этом, но мой ОО условный разум говорит мне, что это плохая практика - не определять переменные члена класса, независимо от того, какой язык используется.

Может быть, фреймворки, на которые вы ссылались, используют этот шаблон в подклассах, где члены определены в суперклассе?

На второй вопрос: вы должны взглянуть на php классы отражения Отражение помогает вам узнать о структуре (конструкторы, методы, свойства) класса.

0 голосов
/ 24 июня 2010

свойства класса по умолчанию определены как публичные, но вы не должны этого делать. Вы должны определить свойства private / protected и определить методы getter / setter для работы с ними вне класса. потом его гораздо легче поддерживать.

...