phpの配列の一部が変更されないようにするにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/1210719

  •  06-07-2019
  •  | 
  •  

質問

このようなphpの配列があります:

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

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

ありがとう!

役に立ちましたか?

解決

" pure"を使用してこれを実行できるとは思わない「本物」配列。

この可能性があるに到達する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 でインスタンス化する必要がありますが、これはあまり配列に似ていません...しかし、その後、配列として使用できます。


そして、「ロック」に書き込もうとすると、プロパティ、例外、またはそのような何かを投げることができます-btw、 ForbiddenWriteException のような新しい Exception クラスを宣言する方が良いでしょう:具体的に< strong>:-)

他のヒント

配列をプライベートにして、誰かが 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

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top