Работа с объектами и классами

Тема в разделе "Как сделать...", создана пользователем Q_BASIC, 12 июн 2015.

  1. Q_BASIC

    Q_BASIC

    Регистр.:
    30 ноя 2013
    Сообщения:
    352
    Симпатии:
    223
    Приветствую,

    Так работает:
    PHP:
    $classname $this->prefix.'_helper';
    $this->{$this->prefix} = new $classname;
    А так нет:
    PHP:
    $this->{$this->prefix} = new $this->prefix.'_helper';
    Лишний раз переменную создавать не хочется, как сделать можно?
     
  2. denverkurt

    denverkurt Denve®

    Регистр.:
    23 дек 2013
    Сообщения:
    609
    Симпатии:
    347
    может попробовать так:
    Код:
    $this->{$this->prefix} = new {$this->prefix}.'_helper';
    или так:
    Код:
    $this->{$this->prefix} = new {$this->prefix.'_helper'};
     
  3. Q_BASIC

    Q_BASIC

    Регистр.:
    30 ноя 2013
    Сообщения:
    352
    Симпатии:
    223
    В обоих случаях ошибка:
    Код:
    Parse error: syntax error, unexpected '{'
     
  4. ZiX

    ZiX Коддинг, Парсинг

    Moderator
    Регистр.:
    9 июл 2011
    Сообщения:
    1.378
    Симпатии:
    562
    Наверное не выйдет, тк пытается создать объект
    $this->prefix

    Так что без новой переменной никак.
     
  5. denverkurt

    denverkurt Denve®

    Регистр.:
    23 дек 2013
    Сообщения:
    609
    Симпатии:
    347
    в конце концов одна строка для хорошего скрипта - капля в море. но если очень зудит - можно попробовать еще через eval()
    тогда всякие скрипты антивирусы будут с подозрением смотреть на ваш код
     
  6. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.403
    Симпатии:
    1.183
    В документации чётко сказано, что передана должна быть строка
    При вашей записи парсер смотрит, что переменная $this->prefix является строкой (или может быть приведена к строке) и создаёт такой класс, а потом уже с этим классом проводит конкатенацию со строкой '_helper'. И это вполне логично, ибо позволяет создав класс использовать его тут же:
    PHP:
    new $this->prefix 100500;
    (new 
    $this->prefix)->some_method();
     
  7. HunterNNm

    HunterNNm Создатель

    Регистр.:
    3 сен 2010
    Сообщения:
    49
    Симпатии:
    6
    Начиная с PHP 5.4 можно вызывать метод класса одной строкой вместе с созданием экземпляра как написали выше - (new Class)->method($params). Если выложите Ваш код и что происходит при вызове $this->prefix.'_helper'; смогу подсказать побольше...
     
  8. dandandan

    dandandan

    Регистр.:
    7 авг 2008
    Сообщения:
    975
    Симпатии:
    255
    Можно попробовать так:

    PHP:
    $this->{$this->prefix} = new (string)$this->prefix.'_helper';
    или
    PHP:
    $this->{$this->prefix} = new (object)$this->prefix.'_helper';
    или не самый лучши, но исключащий вариант дополнительной переменной. Сначала пишем в нужное свойство название класса, а потом эту переменную заменяем на сам объект.
    PHP:
    $this->{$this->prefix} = $this->prefix.'_helper';
    $this->{$this->prefix} = new $this->{$this->prefix}';
    А вообще всегда для переменной можно сделать unset, удалив ее.
    PHP:
    unset($classname);
     
    Последнее редактирование: 22 июн 2015