PHP 5.3 ve arayüz \ ArrayAccess

2 Cevap arrays

Şimdi bir proje üzerinde çalışıyorum ve ben ArrayAccess arabirimini uygulayan bir sınıf var.

: Husus, ben diyor benim uygulaması bir hata alıyorum

must be compatible with that of ArrayAccess::offsetSet().

Benim uygulama şöyle:

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

Benim uygulaması doğru gibi yani, bana görünüyor. Herhangi bir fikir ne yanlış? Çok teşekkürler!

Sınıfı bu gibi görünür:

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]);
  }
}

Sınıfı bu gibi görünür:

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 Cevap

Lütfen namespace veya dosyanın üst use direktifleri onunla uyumlu olması için yanlış ArrayAccess arabirimi için görünmesi gibi görünüyor bana. Gerçi bu direktiflerin olmadan emin söyleyemem.

In general:

Kendi ad alanları başlamak ya da bir ters eğik çizgi ile sona olmamalıdır:

Use: namespace Web\Http;

Don't use something like: namespace \Web\Http; or namespace \Web\Http\;

Eğer dosyada referans her sınıf ve arayüz, bir use direktifini ekleyin:

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 */
}

Burada benim dikkatimi tek şey:

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

Belki ile değiştirilmesi:

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

hile halletmek istiyorum.

Ayrıca yapıştırılan değil kod parçası üzerinde sürükler bir sözdizimi hatası olabilir.