Каков синтаксис PHP, $ variable- & gt; {'string_param'} = $ id ;? [Дубликат]

Просто FYI о юзабилити и , какую разницу он делает или может сделать, если существует такая инструкция

. Рассмотрим фрагмент кода, такой как следующий.

int a = 10;
if ((a = 50) == 50);

System.out.println("Value of a = " + a);

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

Это ситуация, когда это может быть полезно или лучше сказать, влияют на программу.

47
задан j0k 24 September 2012 в 22:00
поделиться

5 ответов

Обновление для PHP 7.0

В PHP 7 введены изменения в отношении того, как обрабатываются косвенные переменные и свойства на уровне анализатора (см. соответствующий RFC для более подробно). Это приближает фактическое поведение к ожидаемому и означает, что в этом случае $obj->$field[0] будет выдавать ожидаемый результат.

В случаях, когда нежелательное поведение по умолчанию (теперь улучшено), фигурные скобки все еще могут использоваться для переопределите его, как показано ниже.

Оригинальный ответ

Напишите такой доступ:

$obj->{$field}[0]

Этот трюк «заключить с фигурными скобками» полезен в PHP всякий раз существует неоднозначность из-за переменных переменных.

Рассмотрим исходный код $obj->$field[0] - означает ли это «доступ к свойству, имя которого дано в $field[0]», или «доступ к элементу с ключом 0 свойства, имя которого дано в $field "? Скобки позволяют вам быть явным.

126
ответ дан Jon 19 August 2018 в 18:13
поделиться

С наследованием. для примера:

YourClass extends stdClass {
   public function YourClass() {
      $this->AnyProperty="any";
   }
}

Теперь AnyProperty динамически объявляется.

-5
ответ дан Drumbeg 19 August 2018 в 18:13
поделиться

aboulfazl, поскольку методы PHP 5.3.3 с тем же именем, что и класс, не будут рассматриваться как конструктор!

    YourClass
    {
        public $any = false;

        public function __construct($any = null)
        {
            $this->any = (is_null($any) ? $this->any : $any);
        }
    }

Это работает, но не спрашивает владелец темы, Джон дает awnser!

0
ответ дан Everterstraat 19 August 2018 в 18:13
поделиться

Магический метод __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 и возвращает правильное значение.

8
ответ дан JvdBerg 19 August 2018 в 18:13
поделиться
  • 1
    Не делай этого. Функции __get - это высокопроизводительные свиньи, которые вам следует избегать, когда это возможно, помимо создания серьезных проблем с неожиданным поведением. Этот пример особенно страшен, поскольку он генерирует исключение, которое может вызвать серьезное поведение приложения, если разработчик не планирует получать доступ к несуществующему атрибуту для исключения исключения, превращая простой доступ к атрибутам в потенциальную фатальную ошибку. – moberemk 26 February 2015 в 19:56

Я думаю, что вы ищете нотацию переменной переменной переменной, которая при доступе к значениям из других массивов / объектов лучше всего использовать с использованием фигурного скобкового синтаксиса:

$obj->{field[0]}
19
ответ дан Mike Brant 19 August 2018 в 18:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: