PHP 5.3和接口\ ArrayAccess

时间:2010-02-13 13:25:05

标签: arrays php

我现在正在开发一个项目,我有一个实现ArrayAccess接口的类。

然而,我收到的错误是我的实施:

必须与ArrayAccess :: offsetSet()的兼容。

我的实现如下:

public function offsetSet($offset, $value) {
  if (!is_string($offset)) {
    throw new \LogicException("...");
  }
  $this->params[$offset] = $value;
}

所以,对我来说,看起来我的实现是正确的。知道什么是错的吗?非常感谢!

班级看起来像这样:

class HttpRequest implements \ArrayAccess {
  // tons of private variables, methods for working
  // with current http request etc. Really nothing that
  // could interfere with that interface.

  // ArrayAccess implementation

  public function offsetExists($offset) {
    return isset ($this->params[$offset]);
  }

  public function offsetGet($offset) {
    return isset ($this->params[$offset]) ? $this->params[$offset] : NULL;
  }

  public function offsetSet($offset, $value) {
     if (!is_string($offset)) {
      throw new \LogicException("You can only assing to params using specified key.");
     }
     $this->params[$offset] = $value;
  }

  public function offsetUnset($offset) {
    unset ($this->params[$offset]);
  }
}

班级看起来像这样:

class HttpRequest implements \ArrayAccess {
  // tons of private variables, methods for working
  // with current http request etc. Really nothing that
  // could interfere with that interface.

  // ArrayAccess implementation

  public function offsetExists($offset) {
    return isset ($this->params[$offset]);
  }

  public function offsetGet($offset) {
    return isset ($this->params[$offset]) ? $this->params[$offset] : NULL;
  }

  public function offsetSet($offset, $value) {
     if (!is_string($offset)) {
      throw new \LogicException("You can only assing to params using specified key.");
     }
     $this->params[$offset] = $value;
  }

  public function offsetUnset($offset) {
    unset ($this->params[$offset]);
  }
}

2 个答案:

答案 0 :(得分:1)

在我看来,文件顶部的namespaceuse指令会让它找到与之兼容的错误ArrayAccess接口。但是,如果没有这些指令,就无法确定。

一般情况下:

您自己的命名空间不应以反斜杠开头或结尾:

使用:     namespace Web\Http;

不要 使用以下内容:     namespace \Web\Http;namespace \Web\Http\;

对于您在文件中引用的每个类和接口,添加use指令:

namespace MyProject;

use MyLibrary\BaseClass; // note no backslash before the namespace name
use \ArrayAccess;
use \Iterator;
use \Countable;

class MyClass extends BaseClass implements ArrayAccess, Iterator, Countable
{
    /* Your implementation goes here as normal */
}

答案 1 :(得分:0)

唯一吸引我眼球的是:

 public function offsetGet($offset) {
    return isset ($this->params[$offset]) ? $this->params[$offset] : NULL;
  }

也许用以下代替:

 public function offsetGet($offset) {
    return (isset ($this->params[$offset]) ? $this->params[$offset] : NULL);
  }

会完成这个技巧。

它也可能是一个语法错误,从您未粘贴的代码部分拖延。