SetProperty到一个类实例

时间:2014-04-25 07:17:27

标签: php class field

我正在尝试动态地将属性设置为类实例。我写了以下内容:

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。但事实并非如此。如何解决这个问题?

1 个答案:

答案 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;

但是,如果您没有真正的理由来揭露无法访问的属性,那么这样做并不是一个好主意。