Pergunta

Eu tenho uma "coleção" de classe, que possui um método Add. O método ADD deve aceitar apenas objetos. Portanto, este é o comportamento desejado:

$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 acordo com o manual do PHP, pode -se digitar métodos precedindo o $arg com um nome de classe. Como todas as aulas de PHP são filhos de stdClass, Achei que essa assinatura do método funcionaria:

public function add(stdClass $obj);

Mas falha com "O argumento deve ser uma instância do stdclass".

Se eu mudar a assinatura para uma classe pai definida por mim, ela funciona:

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

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

Alguém sabe como digitar dica para um objeto genérico?

Foi útil?

Solução

Ao contrário de Java's Object Classe, Php não tem uma classe base para objetos. Objetos não herdam stdClass: É uma implementação de objeto padrão, não uma classe base. Então, infelizmente, você não pode digitar dica para todos os objetos no PHP. Você tem que fazer algo como:

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

Felizmente, o PHP já define o InvalidArgumentException classe para esse fim.

Outras dicas

Não há classe raiz no PHP. Objetos nem mesmo herdar stdClass:

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

Aparentemente não há caminho conhecido no PHP para digitar dica para object Apesar de object é um tipo de dados em PHP (como array), e tipastando para object rende a stdClass objeto:

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

Eu acho que, como solução alternativa, você poderia dizer o método para lançar uma exceção ou morrer com um erro fatal se is_object($obj) Retorna falsa.

Bem, o problema é que o PHP ainda é uma linguagem dinâmica, e dicas de tipo são exatamente isso: dicas. Eu acho que você terá que voltar ao velho is_object ou métodos semelhantes e lançar uma exceção personalizada.

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

No Php 7.2, agora existe um object Dica de tipo. Você pode simplesmente fazer

class Collection {
  public function add(object $obj){
    //do stuff
  }
} 
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top