2012-05-28 38 views
0

是否可以使用关联数组初始化php中的对象私有或受保护成员。PHP - 使用数组参数初始化对象成员

例如:

class TestClass 
{ 
    public $_name; 
    public $_age; 


    public function __construct(array $params) 
    { 
     ?????? 
    } 
} 


$testClass = new TestClass(
    array(
     'name' => 'Bob', 
     'age' => '29', 
    ) 
); 

我想知道是否存在完美的解决方案 - 或许通过实现一个SPL接口或以其他方式?

+0

显而易见的解决方案就是'$ this - > _ name = $ params ['name'];'在构造函数中。你的目标是做什么的?解决方案需要比这更复杂吗? –

+0

@ bob-the-destroyer - 提供的例子是一个简化的用例。实际上会有很多属性要设置 - 所有这些属性都是可选的。 –

+0

只是循环'$ this'或'$ params'会解决什么?你提到SPL - 你是否想要将对象的目的表达为一个数组或其他东西? –

回答

2

你提到SPL。但不知道对象的确切要求,下面是我可以给出的唯一信息...

您可以让您的对象扩展SPL内置类ArrayIterator。然后,而无需在构造函数(父ArrayIterator类已经处理)处理它的关注,你可以导入一个数组到您的对象只是像这样:

class testClass extends ArrayIterator 
{ 

/* child '__construct' method not required */ 

/* rest of your code here */ 

} 

$t = new testClass(array('name' => 'asdf', 'age' => 99)); 

请记住,默认ArrayIterator行为,你不能稍后访问任何传递的数组值,就像使用普通对象属性一样。你必须访问它们,你会数组:

echo $t['name']; // 'asdf' 
echo $t->name; // NULL property unknown error 

而且,在内部,传递的数组存储在您的对象中作为一个单一的私人storage参数。在你的情况下,你已经预先定义好了所有的对象属性,并且前面加了一个下划线,所以你可能需要在你的构造函数中手动遍历$this$params来设置任何实际的对象属性。

你当然可以重新定义所有子对象的ArrayIterator继承的方法来处理你的特殊属性上getset命名情况,但这似乎是多余的和非生产性的,而不是仅仅遍历$params /在你的构造设置$this反正。

public function __construct(array $params) 
    { 
     foreach ($params as $key => $val) { 
      if (property_exists($this, "_$key")) { 
       $this->{"_$key"} = $val; 
      } 
     } 
    } 

所以,只要遍历$params /你的构造函数中设置$this可能是最好的,最简单的办法是有的。

3
foreach ($params as $key=>$value) 
{ 
$key = '_'.$key; 
$this->$key=$value; 
} 

看到代码在线工作样本here

+1

这就是行'$ key ='_'。 $ key'用于。它将“age”改为“_age”,将“name”改为“_name”。 –

+1

用'$ this'替换$ obj'。 – flowfree