2

我在php中有一个这样的数组:

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

我需要这个数组可以沿着脚本访问,以允许在“config”字段中的任何字段中进行更改。有没有办法保护数组或数组的一部分不被修改,就好像它在类中声明为私有一样?我尝试将其定义为常量,但在脚本执行期间它的值会发生变化。将它作为一个类来实现意味着我必须从头开始重建完整的应用程序:S

谢谢!

4

3 回答 3

5

我认为您不能使用“纯”“真实”数组来做到这一点。

解决这个问题的一种方法可能是使用一些实现的类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 回答