1

私ができるように、このような機能はありますか:

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

代わりに:

$array['key'] = $value;

?

魔法のゲッターとセッターを使用し、配列属性を設定したい場合に発生する「オーバーロードされたプロパティの間接的な変更」エラーを回避したいので、私はこれを求めています:

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

カスタムを作成できます。

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

2回目の更新によると-

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 に答える