如何保护 php 中的部分数组不被修改?
Posted
技术标签:
【中文标题】如何保护 php 中的部分数组不被修改?【英文标题】:How can I protect part of an array in php from being modified? 【发布时间】:2010-11-15 16:37:55 【问题描述】:我在 php 中有一个这样的数组:
$myArray = array('name'=>'juank', 'age'=>26, 'config'=>array('usertype'=>'admin','etc'=>'bla bla') );
我需要这个数组在脚本中是可访问的,以允许在“config”字段中的任何字段中进行更改。有没有办法保护数组或数组的一部分不被修改,就好像它在类中声明为私有一样?我尝试将其定义为常量,但在脚本执行期间它的值会发生变化。将它作为一个类来实现意味着我必须从头开始重建完整的应用程序:S
谢谢!
【问题讨论】:
【参考方案1】:您可以将数组设为私有并创建一个方法来修改其内容,以检查是否有人不尝试覆盖 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
【讨论】:
这不正是发帖人想要避免的情况吗?必须将他的数组重新组装成一个类? 恐怕这是唯一的方法,而且我认为这是值得的,因为它就像 5 行代码。【参考方案2】:我认为您不能使用“纯”“真实”数组来做到这一点。
实现这一点的一种方法可能是使用一些实现 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
,会更好:允许专门捕获那些 :-)
【讨论】:
由于应用程序的重组,我试图避免使用类,但鉴于您的解决方案 Pascal,我现在看到使用此类的巨大潜在好处。非常感谢!【参考方案3】:不,很遗憾,没有办法按照您的描述进行操作。变量没有任何公共或私有的概念,除非它们被封装在一个对象中。
不幸的是,您最好的解决方案是将配置重新设计为对象格式。您也许可以在数组中使用包含私有设置的小对象,这可能只允许您更新代码中的几个位置,具体取决于数组的该部分的使用位置。
【讨论】:
以上是关于如何保护 php 中的部分数组不被修改?的主要内容,如果未能解决你的问题,请参考以下文章