phpの配列の一部が変更されないようにするにはどうすればよいですか?
質問
このような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
いいえ、残念ながら、あなたが説明していることをする方法はありません。変数は、オブジェクト内にカプセル化されない限り、パブリックまたはプライベートの概念を持ちません。
残念なことに、構成をオブジェクト形式に作り直すことが最善の解決策です。プライベート設定を含む配列内の小さなオブジェクトを使用できる場合があります。これにより、配列のその部分が使用されている場所に応じて、コード内のいくつかの場所を更新するだけで済みます。