2

私は次のようなphpの配列を持っています:

$ myArray = array('name' =>'juank'、'age' => 26、'config' => array('usertype' =>'admin'、'etc' =>'bla bla'));

「config」フィールドを除くすべてのフィールドで変更を許可するには、この配列がスクリプトに沿ってアクセス可能である必要があります。配列または配列の一部が、クラス内でプライベートとして宣言されているかのように変更されないように保護する方法はありますか?定数として定義しようとしましたが、スクリプトの実行中に値が変化します。クラスとして実装すると、アプリケーション全体を最初から再構築する必要があります:S

ありがとう!

4

3 に答える 3

5

「純粋な」「実際の」配列を使用してこれを行うことはできないと思います。

これに到達する 1 つの方法は、実装するクラスを使用することですArrayInterface。コードは配列を使用しているように見えます...しかし、実際にはオブジェクトを使用しており、一部のデータへの書き込みアクセスを禁止する可能性のあるアクセサーメソッドを使用していると思います...

いくつかのことを変更する 必要があります(クラスの作成、インスタンス化)しかし、すべてではありません: アクセスは依然として配列のような構文を使用しています。


このような何かがうまくいくかもしれません(マニュアルから適応)

class obj implements arrayaccess {
    private $container = array();
    public function __construct() {
        $this->container = array(
            "one"   => 1,
            "two"   => 2,
            "three" => 3,
        );
    }
    public function offsetSet($offset, $value) {
        if ($offset == 'one') {
            throw new Exception('not allowed : ' . $offset);
        }
        $this->container[$offset] = $value;
    }
    public function offsetExists($offset) {
        return isset($this->container[$offset]);
    }
    public function offsetUnset($offset) {
        unset($this->container[$offset]);
    }
    public function offsetGet($offset) {
        return isset($this->container[$offset]) ? $this->container[$offset] : null;
    }
}


$a = new obj();

$a['two'] = 'glop'; // OK
var_dump($a['two']); // string 'glop' (length=4)

$a['one'] = 'boum'; // Exception: not allowed : one

でオブジェクトをインスタンス化する必要がありますがnew、これはあまり配列のようではありません...しかし、その後、それを配列として使用できます。


そして、「ロックされた」プロパティに書き込もうとすると、例外などをスローできます-ところで、のExceptionような新しいクラスを宣言するForbiddenWriteException方が良いでしょう:それらを具体的にキャッチできるようになります:-)

于 2009-07-31T04:49:31.583 に答える
2

配列を非公開にして、誰かがキーを上書きしようとしていないかどうかを確認する内容を変更するメソッドを作成できconfigます。

<?php
    class MyClass {
        private static $myArray = array(
            'config' => array(...),
            'name' => ...,
            ...
        );

        public static function setMyArray($key, $value) {
            if ($key != 'config') {
                $this::myArray[$key] = $value;
            }
        }
    }

次に、呼び出す配列を変更する場合:

MyClass::setMyArray('foo', 'bar'); // this will work
MyClass::setMyArray('config', 'bar'); // this will be ignored
于 2009-07-31T04:48:19.183 に答える
1

いいえ、残念ながら、あなたが説明していることを行う方法はありません。変数は、オブジェクト内にカプセル化されていない限り、パブリックまたはプライベートの概念を持ちません。

残念ながら、最善の解決策は、構成をオブジェクト形式に作り直すことです。プライベート設定を含む配列内の小さなオブジェクトを使用できる場合があります。これにより、配列のその部分が使用されている場所に応じて、コード内のいくつかの場所を更新するだけで済みます。

于 2009-07-31T04:47:04.570 に答える