2010-02-13 5 views
0

Je travaille actuellement sur un projet et j'ai une classe qui implémente l'interface ArrayAccess.PHP 5.3 et l'interface ArrayAccess

Howewer, je reçois une erreur qui dit que ma mise en œuvre:

doit être compatible avec celui de ArrayAccess :: offsetSet().

Ma mise en œuvre ressemble à ceci:

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

Alors, pour moi, il semble que ma mise en œuvre est correcte. Une idée de ce qui ne va pas? Merci beaucoup!

Le look classe comme ceci:

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

Le look classe comme ceci:

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

quelle ligne est de lancer l'erreur? – user103219

+0

La ligne avec la déclaration de classe (la classe X implémente \ ArrayAccess). –

+0

Cela peut être utile si vous fournissez le reste de la classe (ou une version raccourcie). –

Répondre

0

La seule chose qui attire mon attention ici:

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

Peut-être le remplacer par:

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

ferait l'affaire.

Il peut également s'agir d'une erreur de syntaxe qui dérive de la partie du code que vous n'avez pas collée.

+0

Merci, mais bien que ce soit certainement correct et il améliore la lisibilité du code, cela ne m'aide pas avec ce problème. –

+0

Bonne idée avec cette erreur de syntaxe, mais après avoir supprimé l'implémentation, la classe fonctionne à nouveau parfaitement. –

+0

Votre code fonctionne bien ici. Collé dans un fichier et exécuté à partir de la ligne de commande en utilisant: php test.php. Cela doit être quelque chose dans la partie du code que vous n'avez pas collée. –

1

Il me semble que vos directives namespace ou use en haut du fichier font qu'il recherche une mauvaise interface ArrayAccess pour être compatible avec. Je ne peux pas dire avec certitude sans ces directives.

En général:

Vos propres espaces de noms ne devraient pas commencer ou se terminer par une barre oblique inverse:

Utilisation: namespace Web\Http;

Ne pasutiliser quelque chose comme : namespace \Web\Http; ou namespace \Web\Http\;

Pour chaque classe et de l'interface que vous faites référence dans votre fichier, ajoutez une directive 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 */ 
}