2017-01-27 4 views
0

Есть ли способ создать переменную внутри объекта из строки? например:PHP Создание локальных переменных из строки

class Whatever { 

    public function createVariables() { 
     $this["variable_name"] = 100; 
    } 

} 

Я хочу динамически создавать переменные в зависимости от набора правил, определенных дочерним классом.

+1

Существует, как правило, очень мало причин, когда считается приемлемым использовать динамически названные переменные (varvars), возможно вы могли бы рассказать нам о том, чего вы пытаетесь достичь (и что привело вас к вашему текущему решению/попытке), чтобы кто-то мог предложить лучшее решение? Если вы просто заполняете массив классов (например, '$ this-> my_array [" foo "] =" bar ";'), это что-то совершенно другое. – ccKep

+0

@ccKep Я пытаюсь реализовать свою собственную версию моделей laravel, но для apis и т. Д. Я хочу иметь возможность определять переменные «на лету», как это происходит с файлами. – Goodwin

+0

К сожалению, до сих пор я не использовал Laravel, есть ли у вас ссылка на пример/ресурс, который кратко описывает ваш сценарий? Похоже, что [перегрузка свойств] (http://php.net/manual/en/language.oop5.overloading.php#object.set) может вам пригодиться? – ccKep

ответ

1
class Whatever { 

    public function createAttributes($attribute_name, $attribute_value = NULL) { 
     $this->{$attribute_name} = $attribute_value; 
    } 
} 

Это путь в PHP, чтобы добавлять атрибуты динамически, ничего связанные специально для Laravel

Laravel также имеет встроенный способ https://github.com/illuminate/database/blob/v4.2.17/Eloquent/Model.php#L2551

+0

Нет необходимости в '{}', вы можете сделать '$ this -> $ attribute_name = $ attribute_value;' – miken32

+0

, если атрибут не существует, это правильно? Как и при создании их во время выполнения. –

+0

@Thomas Nop, только если ваша переменная будет иметь какое-то причудливое имя, например. '$ this-> foo = 'baz'; $ this -> $ this-> foo = 'bar'; '... В этом случае вам понадобится' $ this -> {$ this-> foo} = 'bar'; '. – ccKep

-3
class Whatever { 

    protected $id; 

    public function createAttributes($id) { 
     $this->id = $id; 
     return $this; 
    } 
} 

Вы можете назвать эту переменную как $this->id внутри других функций