PHP: Как создать переменные объекта?
Так, например, у меня есть этот код:
class Object{
public $tedi;
public $bear;
...some other code ...
}
Теперь, как вы видите, в этом классе есть общедоступные переменные. То, что я хотел бы сделать, - это сделать эти переменные динамически, с функцией что-то вроде:
private function create_object_vars(){
// The Array what contains the variables
$vars = array("tedi", "bear");
foreach($vars as $var){
// Push the variables to the Object as Public
public $this->$var;
}
}
Итак, как я должен создавать общедоступные переменные динамическим способом?
Ответы
Ответ 1
Да, вы можете это сделать.
Вы в значительной степени верны - это должно сделать это:
private function create_object_vars(){
// The Array of names of variables we want to create
$vars = array("tedi", "bear");
foreach($vars as $var){
// Push the variables to the Object as Public
$this->$var = "value to store";
}
}
Обратите внимание, что это использует имя переменной переменной, которая может делать некоторые сумасшедшие и опасные вещи!
В соответствии с комментариями члены, созданные таким образом, будут общедоступны - я уверен, что есть способ создания защищенных/закрытых переменных, но это, вероятно, не просто (например, вы могли бы сделать это с помощью C Zend API в расширении).
Ответ 2
$vars = (object)array("tedi"=>"bear");
или
$vars = new StdClass();
$vars->tedi = "bear";
Ответ 3
В качестве альтернативы вы также можете получить свой объект из ArrayObject
. Таким образом, он наследует поведение массива и несколько методов, облегчающих впрыскивание атрибутов.
class YourObject extends ArrayObject {
function __construct() {
parent::__construct(array(), ArrayObject::PROPS_AS_ARRAY);
}
function create_object_vars() {
foreach ($vars as $var) {
$this[$var] = "some value";
}
}
Атрибуты будут тогда доступны как $this->var
и $this["var"]
аналогично, что может или не может соответствовать варианту использования. Альтернативным методом установки атрибутов будет $this->offsetSet("VAR", "some value");
.
Btw, нет ничего плохого в переменных переменных. Они являются правильной конструкцией языка, так как будут повторно использовать ArrayObject.