ArrayAccess演练与问题

时间:2011-06-10 19:20:50

标签: php arrayaccess

我对PHP中实现ArrayAccess的实现有一些疑问。

以下是示例代码:

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 (is_null($offset)) {
            $this->container[] = $value;
        } else {
            $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;
    }
}

问题:

  1. 我不是在问为什么我们必须实现ArrayAccess,因为我假设它是PHP引擎识别的特殊接口并自动调用已实现的继承函数?
  2. 为什么我们声明已实现的功能是公开的?因为我认为它们是自动调用的特殊函数。他们不应该是私人的,因为在打电话说$obj["two"]时,不会从外面调用这些功能。
  3. 是否有特殊原因在__constructor函数中分配填充数组?这是我所知道的构造函数,但在这种情况下它有什么样的帮助。
  4. ArrayAccessArrayObject之间有什么区别?我认为通过继承ArrayAccess实现的类不支持迭代?
  5. 如果不实施ArrayAccess
  6. ,我们如何实现对象索引?

    ...谢谢

1 个答案:

答案 0 :(得分:3)

  1. 正确
  2. 由于the interface将其定义为公开,因此您还必须
  3. 如果您不想*
  4. ,则不必以这种方式编写构造函数
  5. ArrayAccessinterfaceArrayObject是一个类(它本身实现ArrayAccess
  6. 我不知道其他任何方式
  7. *您的构造函数可能如下所示

    public function __construct( array $data ) {
        $this->container = $data;
    }