Pregunta

Tengo una clase 'Collection', que tiene un método Add. El método add sólo debe aceptar objetos. Así que este es el comportamiento deseado:

$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

De acuerdo con el manual de PHP, uno puede typehint métodos por los prologar la $arg con un nombre de clase. Puesto que todas las clases de PHP son hijos de stdClass, pensé que esta firma método funcionaría:

public function add(stdClass $obj);

Pero falla con "argumento debe ser una instancia de stdClass".

Si cambio de la firma de una clase padre definido por mí, entonces funciona:

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

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

¿Alguien sabe cómo escribir sugerencia para un objeto genérico?

¿Fue útil?

Solución

A diferencia de clase Object de Java, PHP no tiene una clase base para objetos . Objetos hacen stdClass no hereda: se trata de una aplicación de objeto por defecto, no una clase base. Así que, por desgracia, no se puede escribir sugerencia para todos los objetos en PHP. Usted tiene que hacer algo como:

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

Por suerte, PHP ya define la clase InvalidArgumentException para ese propósito.

Otros consejos

No hay ninguna clase raíz en PHP. Objetos ni siquiera se heredan de stdClass:

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

manera Aparentemente hay no se sabe en PHP para escribir sugerencia para object aunque object es un tipo de datos en PHP (como array), y typecasting a object produce un objeto stdClass:

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

Creo que como una solución que podría decir el método de lanzar una excepción o morir con un error fatal si los rendimientos is_object($obj) falsa.

Bueno, la cosa es que PHP es todavía un lenguaje dinámico, y el tipo de consejos son sólo eso: consejos. Creo que tendrá que recurrir a la vieja is_object o métodos similares y lanzar una excepción personalizada.

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 ahora hay una sugerencia de tipo object. Simplemente puede hacer

class Collection {
  public function add(object $obj){
    //do stuff
  }
} 
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top