Просто FYI о юзабилити и , какую разницу он делает или может сделать, если существует такая инструкция
. Рассмотрим фрагмент кода, такой как следующий.
int a = 10;
if ((a = 50) == 50);
System.out.println("Value of a = " + a);
Ясно, что в этом случае оператор if
изменяет вывод. Таким образом, подобное заявление может иметь значение.
Это ситуация, когда это может быть полезно или лучше сказать, влияют на программу.
В PHP 7 введены изменения в отношении того, как обрабатываются косвенные переменные и свойства на уровне анализатора (см. соответствующий RFC для более подробно). Это приближает фактическое поведение к ожидаемому и означает, что в этом случае $obj->$field[0]
будет выдавать ожидаемый результат.
В случаях, когда нежелательное поведение по умолчанию (теперь улучшено), фигурные скобки все еще могут использоваться для переопределите его, как показано ниже.
Напишите такой доступ:
$obj->{$field}[0]
Этот трюк «заключить с фигурными скобками» полезен в PHP всякий раз существует неоднозначность из-за переменных переменных.
Рассмотрим исходный код $obj->$field[0]
- означает ли это «доступ к свойству, имя которого дано в $field[0]
», или «доступ к элементу с ключом 0
свойства, имя которого дано в $field
"? Скобки позволяют вам быть явным.
С наследованием. для примера:
YourClass extends stdClass {
public function YourClass() {
$this->AnyProperty="any";
}
}
Теперь AnyProperty динамически объявляется.
aboulfazl, поскольку методы PHP 5.3.3 с тем же именем, что и класс, не будут рассматриваться как конструктор!
YourClass
{
public $any = false;
public function __construct($any = null)
{
$this->any = (is_null($any) ? $this->any : $any);
}
}
Это работает, но не спрашивает владелец темы, Джон дает awnser!
Магический метод __get - ваш друг:
class MyClass
{
private $field = array();
public function __get($name)
{
if(isset($this->field[$name]))
return $this->field[$name];
else
throw new Exception("$name dow not exists");
}
}
Использование:
$myobj = new MyClass();
echo $myobj->myprop;
Объяснение: Все ваши данные поля хранятся в массиве. При доступе к $myobj->myprop
это свойство явно не существует в классе. Именно здесь вызывается __get
. __get
ищет имя в массиве field
и возвращает правильное значение.
Я думаю, что вы ищете нотацию переменной переменной переменной, которая при доступе к значениям из других массивов / объектов лучше всего использовать с использованием фигурного скобкового синтаксиса:
$obj->{field[0]}