我认为您不能使用“纯”“真实”数组来做到这一点。
解决这个问题的一种方法可能是使用一些实现的类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
,会更好:允许专门捕获那些:-)