【问题标题】:PHP - Initialize object members with array parameterPHP - 使用数组参数初始化对象成员
【发布时间】:2012-06-03 02:20:11
【问题描述】:

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

例如:

    class TestClass
{
    public $_name;
    public $_age;


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


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

我想知道是否有一个优雅的解决方案 - 也许通过实现一个 spl 接口或其他方式?

【问题讨论】:

  • 显而易见的解决方案就是构造函数中的$this->_name = $params['name'];。你的对象做什么?解决方案是否需要比这更复杂?
  • @bob-the-destroyer - 提供的示例是一个简化的用例。实际上会有很多属性需要设置——所有这些都是可选的。
  • 循环遍历$this$params 会解决吗?您提到了 SPL - 您是否考虑让对象的目的表现为数组或其他什么?
  • 是的,我认为使用 spl 可能会有类似的解决方案
  • 去做吧,它有效。如何做到这一点取决于您的需求。

标签: php spl


【解决方案1】:

你提到了 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/setting $this 可能是最好、最简单的解决方案。

【讨论】:

    【解决方案2】:
    foreach ($params as $key=>$value)
    {
     $key = '_'.$key;
     $this->$key=$value;
    }
    

    在线查看代码以获取工作示例here

    【讨论】:

    • 这就是$key = '_' . $key 的用途。它将'age' 更改为'_age''name' 更改为'_name'
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-26
    • 1970-01-01
    相关资源
    最近更新 更多