变量变量可以用于动态分配类属性,以便允许在PHP中使用变量参数的类构造函数吗?

时间:2014-06-05 04:02:55

标签: php class variables properties constructor

我正在构建一个类,并且最初想要重载构造,但发现这在PHP中是不允许的。我的解决方案是为一个构造函数使用变量参数。但是,我在key =>中使用字符串文字时遇到了一些问题。值对并分配类属性。这让我问我的主要问题 - 是否可以使用变量变量通过构造函数来分配类属性?

见下面的例子:

class funrun{

   protected $run_id; 
   protected $fun_id; 
   protected $funrun_title; 
   protected $date; 

   function __construct(){

     if (func_num_args() > 0){
       $args = func_get_args(0); 
       foreach($args as $key => $value){
          $this->$key = $value;
       }

     $this->date = date();

     function __get($name){
        return $this->name; 
     }

     function __set($name,$value){
         $this->name = $value; 
     } 

}

这似乎正确地分配了值。但是当我做以下事情时:

$settings = array ('run_id' => 5, 'fun_id' => 3); 
$fun_example = new funrun($settings); 
echo $fun_example->run_id; 

我收到一个错误,即getter方法无效:

Undefined property: funrun::$name

但是,当我将类代码切换到$ this->键时,类似的属性似乎根本没有分配。当我执行$ fun_example-> $ run_id时,不会返回任何内容。

我在这里缺少什么?无论如何使用带有字符串文字的数组来分配类属性?如果没有,用构造函数解决变量参数问题的好方法是什么?

1 个答案:

答案 0 :(得分:1)

$this->name正在寻找名为name的媒体资源。变量属性写为:

$this->$name

请参阅{{3>}

上的PHP文档中的类属性也可以使用变量属性名访问

您的构造函数写错了。它遍历参数列表,期望它是一个关联数组。但是您将设置作为单个参数传递。所以它应该是:

function __construct($args) {
    foreach ($args as $key => $value) {
        $this->$key = $value;
    }
    $this->date = time();
}