#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;
}