我正在尝试动态地将属性设置为类实例。我写了以下内容:
class MyClass{
public function setProp($prop){
$this->{$prop}=$prop;
}
}
$inst= new MyClass();
$vari='123';
$inst->setProp($vari);
echo $inst->vari;
我预计在$ inst-> setProp($ vari)之后;方法调用$inst
MyClass
实例的vari
字段的值为123
。但事实并非如此。如何解决这个问题?
答案 0 :(得分:0)
在您的情况下,您将设置名称为123
的属性,该属性不是有效属性。如果您的代码是
$vari='asd';
$inst->setProp($vari);
echo $inst->asd;
您将成功创建名为asd
且值相同的属性
因为它获取变量值,而不是它的名称。
(编辑:我之前的解释是错误的)
您最好使用属性名称第二个参数。
class MyClass{
public function setProp($name, $value){
$this->{$name}=$value;
}
}
$inst= new MyClass();
$vari='123';
$inst->setProp('vari',$vari);
echo $inst->vari;
如果你没有任何逻辑(成为一个有效的制定者),那么哪个过程就像是一种矫枉过正。 未定义的属性将自动设置
<?php
class MyClass{
}
$inst= new MyClass();
$inst->vari = 123;
echo $inst->vari;
P.S。:如果你在财产存在及其私人/受保护的
时尝试,你会遇到麻烦class MyClass{
private $vari = 100;
public function setProp($name, $value) {
$this->{$name} = $value;
}
}
$inst= new MyClass();
$vari = 123;
$inst->setProp('vari', $vari);
echo $inst->vari;
将导致Fatal error: Cannot access private property MyClass::$vari
要访问私有/受保护/不存在的属性,您可以使用魔术方法__get()
。要写入,请使用__set()
。
class MyClass{
private $vari = 100;
public function __set($name, $value) {
$this->{$name} = $value;
}
public function __get($name) {
return $this->{$name};
}
}
$inst= new MyClass();
$inst->vari = 123;
echo $inst->vari;
但是,如果您没有真正的理由来揭露无法访问的属性,那么这样做并不是一个好主意。