$this-> «значение переменной» ООП PHP

#php

#php

Вопрос:

Мне интересно, возможно ли это, и в случае, если это так, как я могу этого добиться:

$this->id <— у меня есть такая вещь. но чтобы сделать его более удобным, я бы хотел иметь $this->(and here to change the values)

например: у меня может быть $this->id $this->allID $this->proj_id

как я могу сделать так, чтобы на самом деле у меня было $this->($myvariable here, that has a unique name in it) ?

Ответ №1:

Вы можете просто использовать это:

  $variable = 'id';
 if ( isset ( $this->{$variable} )  ) 
 {
    echo $this->{$variable};
 }
  

Комментарии:

1. Я бы использовал $this-> {$variable} на всякий случай, если $variable вычисляет что-то, содержащее дефис. $this->something не является допустимым выражением, тогда как $this-> {‘something’} будет работать просто отлично.

2. @GordyD — хорошо, у меня есть что-то подобное на самом деле в моем ООП PHP … В моем классе я защитил статический $tableId = ‘sched_id’; а в расширенном классе у меня есть что-то вроде этого: $this-> static:: $tableId но это не работает..

3. Опять же, $this-> {$variable} ИМХО лучше. В вашем решении второй знак доллара может быть легко незаметен.

4. @Crashspeeder — Спасибо за комментарии, ребята. Я обновил свой ответ в соответствии с вашими предложенными улучшениями.

Ответ №2:

Вот решение: http://www.php.net/manual/en/language.oop5.overloading.php#language.oop5.overloading.members

Пример его использования здесь :

 class myClass {
    /**  Location for overloaded data.  */
    private $myProperties = array();

    public function __set($name, $value)
    {
        $this->myProperties[$name] = $value;
    }

    public function __get($name)
    {
        if (array_key_exists($name, $this->myProperties))
        {
            return $this->data[$name];
        }
    }
}
  

Ответ №3:

Вы должны ознакомиться с руководством по переменным переменным на сайте PHP. При этом это может выглядеть так:

 <?php
   echo ${'this->'.$yourvariable};  
?>
  

Комментарии:

1. Я думаю, что $this-> {$yourvariable} выглядит намного лучше.

Ответ №4:

Я предпочитаю использовать call_user_func и передавать параметры как array вместо этого.

 public function dynamicGetterExample()
{
    $property = 'name'; // as an example...
    $getter = 'get'.ucfirst($property);

    $value = call_user_func(array($this,$getter));
    if (empty($value)) {
        throw new Exception('Required value is empty for property '.$property);
    }

    return $value;
}