3 Stimmen

typehinting: Methode sollte jedes $arg akzeptieren, das ein Objekt ist

Ich habe eine Klasse 'Collection', die eine Add-Methode hat. Die add-Methode sollte nur Objekte akzeptieren. Dies ist also das gewünschte Verhalten:

$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

Laut dem PHP-Handbuch kann man Methoden durch Voranstellen der $arg mit einem Klassennamen. Da alle PHP-Klassen Kinder von stdClass Ich dachte mir, dass diese Methode funktionieren würde:

public function add(stdClass $obj);

Aber es schlägt fehl mit "Argument muss eine Instanz von stdClass sein".

Wenn ich die Signatur auf eine von mir definierte übergeordnete Klasse ändere, dann funktioniert es:

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

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

Weiß jemand, wie man einen Hinweis für ein allgemeines Objekt eingeben kann?

5voto

netcoder Punkte 64375

Im Gegensatz zu Javas Object Klasse, PHP hat keine Basisklasse für Objekte . Objekte erben nicht stdClass : Es handelt sich um eine Standardobjektimplementierung, nicht um eine Basisklasse. Man kann also leider nicht für alle Objekte in PHP einen Type Hint angeben. Sie müssen etwas tun wie:

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

Glücklicherweise definiert PHP bereits die InvalidArgumentException Klasse zu diesem Zweck.

4voto

BoltClock Punkte 660640

In PHP gibt es keine Root-Klasse. Objekte erben nicht einmal von stdClass :

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

Offenbar gibt es in PHP keine bekannte Möglichkeit, einen Hinweis für object auch wenn object ist ein Datentyp in PHP (wie array ), und das Typecasting auf object ergibt sich ein stdClass Objekt:

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

Ich schätze, als Abhilfe könnten Sie der Methode sagen, dass sie eine Ausnahme auslösen oder mit einem schwerwiegenden Fehler sterben soll, wenn is_object($obj) gibt false zurück.

0voto

Daff Punkte 42755

Nun, die Sache ist die, dass PHP immer noch eine dynamische Sprache ist, und Typ-Hinweise sind genau das: Hinweise. Ich denke, Sie werden auf die alte Methode zurückgreifen müssen is_object oder ähnliche Methoden und lösen eine benutzerdefinierte Ausnahme aus.

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

0voto

Adam Punkte 20147

In PHP 7.2 gibt es jetzt eine object Hinweis zum Typ. Sie können einfach tun

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X