【问题标题】:SetProperty to a class instanceSetProperty 到类实例
【发布时间】:2014-04-25 07:17:26
【问题描述】:

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

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

【问题讨论】:

  • 您的setProp() 调用尝试设置名称为123 和值123 的属性。
  • @hindmost 是否可以设置名称为vari 和值123 的属性
  • $vari 只是调用setProp()的outside的变量名,在set prop里面,只有一个值 123 分配给名为$prop 的局部变量。 setProp() 甚至不知道值 123 来自一个变量——它同样可能来自一个常量、类常量、数组元素、硬编码值等......它只是一个接收到的值。它不知道$vari,也不关心
  • @MarkBaker 你的意思是作为函数参数传递的表达式在函数调用自身之前解析吗?
  • 传递给 setProp() 的值是参数的 value,无论你是 $vari='123'; $inst->setProp($vari); 还是 $inst->setProp(123); 还是 $vari='123'; function($t) { return $t; ) $inst->setProp(function($vari));.... 是的,它在调用 setProp() 之前解决

标签: php class field


【解决方案1】:

在您的情况下,您将设置名称为 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()。为了写入then,你应该使用__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;

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-24
    • 1970-01-01
    • 1970-01-01
    • 2011-12-18
    • 1970-01-01
    • 2012-04-27
    • 1970-01-01
    • 2013-06-10
    相关资源
    最近更新 更多