1

有没有这样的功能,所以我可以这样做:

populate_array($array, 'key', $value)

而不是这样做:

$array['key'] = $value;

?

我问这个是因为我想规避在使用魔法 getter 和 setter 并且想要设置数组属性时发生的“间接修改重载属性”错误:

class MyClass
{
    private $string;
    private $array;

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

    public function __get($attribute)
    {
        if (isset($attribute))
        {
            return $this->$attribute;
        }
    }
}

$obg = new MyClass();

$obg->string = 'Hey it works!';
$obg->array = ['This works', 'too!'];
$obg->array['key'] = 'This will throw `Indirect modification of overloaded property MyClass::$array has no effect`';
4

4 回答 4

1

在您的情况下,这应该是正确的代码:

class MyClass
{

}

$obg = new MyClass();

$obg->string = 'Hey it works!';
$obg->array = ['This works', 'too!'];
$obg->array['key'] = 'This will NOT throw `Indirect modification...';

但是如果你有充分的理由使用魔法__get__set私有属性,那么让你的array属性成为一个实现的对象ArrayAccess,或者只使用ArrayObject类:

$obg->array = new ArrayObject(['This works', 'too!']);
$obg->array['key'] = 'This will NOT throw `Indirect modification...';
于 2013-07-04T11:04:54.290 回答
1

您可以创建自定义的。

function setArrayValue(&$array, $key, $value)
{
    $array[$key] = $value;
}

根据您的第二次更新-

class MyClass
{
    private $arr1;
    private $arr2;

    public function setArrayValue($arrayName, $key, $value)
    {
        $this->$arrayName[$key] = $value;
    }
}

$obg = new MyClass();
$obg->setArrayValue('arr1', 2, 3);
$obg->setArrayValue('arr3', 6, 9);

可能有很多方法,这取决于你的需要。

于 2013-07-04T10:39:19.250 回答
1

我建议您创建一个公共方法来修改类中的内部变量。这是它应该做的方式。(封装原理

class MyClass
{
    private $string;
    private $array;

    public function setArrayAtKey($key, $value){
        $this->array[$key] = $value;
    }
}

并称它为:

$obg = new MyClass();
$obg->setArrayAtKey('key', 'this works');
于 2013-07-04T10:40:14.363 回答
1

我会在你的类中添加一个方法:

class MyClass
{
    private $string;
    private $array;
/* snip */

    public function addItem($key, $value){
        $this->array[$key] = $value;
    }
}

这将允许您从课堂外设置:

$obg = new MyClass();
$obg->addItem('someKey','someValue');//Assumes array already exists.
于 2013-07-04T10:40:25.350 回答