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

Q_BASIC

Хранитель порядка
Регистрация
30 Ноя 2013
Сообщения
516
Реакции
1.240
Приветствую,

Так работает:
PHP:
$classname = $this->prefix.'_helper';
$this->{$this->prefix} = new $classname;

А так нет:
PHP:
$this->{$this->prefix} = new $this->prefix.'_helper';

Лишний раз переменную создавать не хочется, как сделать можно?
 
может попробовать так:
Код:
$this->{$this->prefix} = new {$this->prefix}.'_helper';
или так:
Код:
$this->{$this->prefix} = new {$this->prefix.'_helper'};
 
в конце концов одна строка для хорошего скрипта - капля в море. но если очень зудит - можно попробовать еще через eval()
тогда всякие скрипты антивирусы будут с подозрением смотреть на ваш код
 
А так нет:
PHP:
$this->{$this->prefix} = new $this->prefix.'_helper';

В документации чётко сказано, что передана должна быть строка
http://php.net/manual/ru/language.oop5.basic.php написал(а):
Если с директивой new используется строка (string), содержащая имя класса, то будет создан новый экземпляр этого класса.

При вашей записи парсер смотрит, что переменная $this->prefix является строкой (или может быть приведена к строке) и создаёт такой класс, а потом уже с этим классом проводит конкатенацию со строкой '_helper'. И это вполне логично, ибо позволяет создав класс использовать его тут же:
PHP:
new $this->prefix + 100500;
(new $this->prefix)->some_method();
 
Начиная с PHP 5.4 можно вызывать метод класса одной строкой вместе с созданием экземпляра как написали выше - (new Class)->method($params). Если выложите Ваш код и что происходит при вызове $this->prefix.'_helper'; смогу подсказать побольше...
 
PHP:
$this->{$this->prefix} = new $this->prefix.'_helper';

Можно попробовать так:

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);
 
Последнее редактирование:
Назад
Сверху