Frage

PHP, wie wir alle wissen, ist sehr lose typisiert. Die Sprache ist es nicht erforderlich, jede Art von Typ für Funktionsparameter oder Klassenvariablen angeben. Dies kann eine leistungsstarke Funktion sein.

Manchmal aber, es kann Ihr Skript eine schmerzliche Erfahrung machen debuggen. Beispielsweise verläuft eine Art von Gegenstand in ein Verfahren, das eine andere Art von Objekt kann erwartet Fehlermeldungen beschwert, dass ein bestimmte Variable / Verfahren existiert für das übergebene Objekt nicht erzeugen. Diese Situationen sind meist Belästigungen. Weitere belastende Probleme sind, wenn Sie mit einem Objekt der falschen Klasse ein Objekt initialisieren, und dass „falsches Objekt“ wird bis später nicht mehr in der Ausführung des Skripts verwendet werden. In diesem Fall wird am Ende einen Fehler immer viel später, als wenn Sie das ursprüngliche Argument übergeben.

Statt zu klagen, was ich bestehen keine bestimmte Methode oder Variable habe, oder warten, bis viel später in der Skriptausführung für meinen in-Objekt übergeben verwendet werden soll, Ich würde viel lieber einen Fehler habe Nachricht an genau, wo ich ein Objekt vom falschen Typ angeben, über den Objekttyp beschwere falsch oder nicht kompatibel zu sein.

Wie gehen Sie diese Situationen in Ihrem Code? Wie erkennen Sie inkompatible Typen? Wie kann ich eine Art-Überprüfung in meine Skripte einführen, damit ich leichte Fehlermeldungen zu verstehen bekommen kann?

Auch, wie können Sie dies tun, während alle für die Vererbung Buchhaltung in Php? Bedenken Sie:

<?php
class InterfaceClass
{
#...
}

class UsesInterfaceClass
{
   function SetObject(&$obj) 
   {
       // What do I put here to make sure that $obj either
       // is of type InterfaceObject or inherits from it       

   }
}
?>

Dann wird ein Benutzer dieses Code implementiert die Schnittstelle mit ihrer eigenen konkreten Klasse:

<?php

class ConcreteClass extends InterfaceClass
{
}



?>

Ich mag ConcreteClass Instanzen und alle Zukunft unbekannt benutzerdefinierte Objekte, auch zu SetObject akzeptabel sein. Wie würden Sie diese zulässige machen für den richtigen Typ bei der Prüfung?

War es hilfreich?

Lösung

Eigentlich für Klassen können Sie Type Hinting in PHP (5 +) liefern.

 <?php
 class UsesBaseClass
 {
      function SetObject(InterfaceObject $obj) 
      {
      }
 }
 ?>

Dies wird auch korrekt mit Vererbung arbeiten, wie Sie es erwarten würden.

Als beiseite, setzen Sie nicht das Wort ‚Objekt‘ in Ihrem Klassennamen ...

Andere Tipps

als Ergänzung zu Eran Galperin Antwort können Sie auch die Type Hinting verwenden Parameter zu zwingen Arrays zu sein -. Nicht nur Objekte einer bestimmten Klasse

<?php
class MyCoolClass {
   public function passMeAnArray(array $array = array()) {
      // do something with the array  
   }  
 }  
 ?>

Wie Sie sehen können Sie Hinweis geben kann, dass die ::passMeAnArray() Methode einen Standardwert im Falle eines array sowie liefern erwartet das Verfahren w / o alle Parameter aufgerufen wird.

Für primitive Typen, die Sie auch die is_ * Funktionen verwenden:

public function Add($a, $b)
{
  if (!is_int($a) || !is_int($b))
    throw new InvalidArgumentException();
  return $a + $b;
}

Sie sehen, gibt es mehrere Antworten zu Type Hinting. Dies ist die technische Lösung. Aber Sie sollten auch sicherstellen, dass das gesamte Design ist sinnvoll und intuitiv. Dies wird Typ Probleme und Fehler seltener machen.

Denken Sie daran, dass selbst wird diese Art Ausfälle geworfen werden zur Laufzeit . Vergewissern Sie sich, Tests für den Code.

Auch im Fall, dass Sie beschreiben, Ihr Skript zum Absturz bringen, beschweren gibt es keine Methode / Attribut X auf dem Objekt Y damit Sie wissen, woher das kommt.

Wie auch immer, ich denke, dass immer versuchen Programmierer zu verhindern wuchs das falsche Objekt an eine Methode zu übergeben, ist keine gute Zeit-Investition: Sie es bei der Dokumentation und Ausbildung statt verbringen könnten

.

Duck Typing und vorsichtig Kollegen ist, was Sie brauchen, nicht zusätzliche Kontrollen, die Sie App steifer machen.

Aber es kann eine Pythonista Sicht sein ...

Eran Galperin ‚s Antwort ist die bevorzugte Methode, um sicherzustellen, das Objekt Sie verwenden den richtigen Typ ist.

Erwähnenswert ist auch die instanceOf Betreiber - es ist hilfreich, wenn Sie, dass ein überprüfen möchten Objekt ist eine von mehreren Arten.

Sie können die error_reporting ini in der php.ini-Datei oder verwenden Sie Funktion error_reporting es in der Laufzeit einstellen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top