Question

J'ai une classe « Collection », qui a une méthode d'ajout. La méthode d'ajout ne doit accepter des objets. Donc, c'est le comportement souhaité:

$x=5;//arbitrary non-object
$obj=new Foo; //arbitrary object

$collection=new Collection;
$collection->add($obj); //should be acceptable arg, no matter the actual class
$collection->add($x); //should throw an error because $x is not an object

D'après le manuel PHP, on peut typehint méthodes préfacer le $arg avec un nom de classe. Étant donné que toutes les classes PHP sont des enfants de stdClass, je me suis dit cette signature de la méthode fonctionnerait:

public function add(stdClass $obj);

Mais il échoue avec « L'argument doit être une instance de stdClass ».

Si je change la signature à une classe parente définie par moi, alors cela fonctionne:

class Collection {
  public function add(Base $obj){
    //do stuff
  }
}

$collection->add($foo); //$foo is class Foo which is an extension of Base

Quelqu'un sait comment taper indice pour un objet générique?

Était-ce utile?

La solution

Contrairement à la classe Object de Java, PHP ne dispose pas d'une classe de base pour les objets . Les objets ne stdClass pas Hériter: il est une implémentation de l'objet par défaut, pas une classe de base. Donc, malheureusement, vous ne pouvez pas taper indice pour tous les objets en PHP. Vous devez faire quelque chose comme:

class MyClass {
    public function myFunc($object) {
        if (!is_object($object))
             throw new InvalidArgumentException(__CLASS__.'::'.__METHOD__.' expects parameter 1 to be object");
    }
}

Heureusement, PHP définit déjà la classe InvalidArgumentException à cette fin.

Autres conseils

Il n'y a pas de classe de racine en PHP. Les objets ne même pas hériter de stdClass:

class Foo {}
var_dump(new Foo instanceof stdClass); // bool(false)
var_dump(get_parent_class(new Foo));   // bool(false)

Apparemment, il n'y a aucun moyen connu en PHP pour taper indice pour object même si object est un type de données en PHP (comme array), et transtypage à object donne un objet stdClass:

echo get_class((object) "string"); // stdClass

Je suppose que comme solution de contournement, vous pouvez dire la méthode de lancer une exception ou mourir avec une erreur fatale si is_object($obj) retourne faux.

Eh bien la chose est que PHP est encore un langage dynamique, et des notes de type sont que des conseils. Je pense que vous devrez revenir à l'ancien is_object ou des méthodes similaires et lancer une exception personnalisée.

class Collection {
  public function add(Base $obj){
    if(!is_object($obj))
    throw new Exception("Parameter must be an object");
    // do stuff
  }
}

En PHP 7.2, il est maintenant un indice de type object. Vous pouvez simplement faire

class Collection {
  public function add(object $obj){
    //do stuff
  }
} 
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top