2008-09-26 8 views
3

PHP, wie wir alle wissen, ist sehr locker typisiert. Für die Sprache müssen Sie keinen Typ für Funktionsparameter oder Klassenvariablen angeben. Dies kann eine leistungsstarke Funktion sein.Wie verhindere ich die Verwendung des falschen Typs in PHP?

Manchmal kann es jedoch das Debuggen Ihres Skripts zu einer schmerzhaften Erfahrung machen. Wenn beispielsweise ein Objekt in eine Methode übergeben wird, die eine andere Art von Objekt erwartet, kann dies zu Fehlermeldungen führen, die darauf hinweisen, dass eine bestimmte Variable/Methode für das übergebene Objekt nicht existiert. Diese Situationen sind meistens Ärgernisse. Schwierigere Probleme treten auf, wenn Sie ein Objekt mit einem Objekt der falschen Klasse initialisieren und dieses "falsche Objekt" erst später in der Skriptausführung verwendet wird. In diesem Fall erhalten Sie viel später einen Fehler als bei der Übergabe des ursprünglichen Arguments.

Statt zu klagen, was ich bestanden haben keine bestimmte Methode oder Variable, oder warten, bis viel später in der Skriptausführung für meine in-Objekt übergeben verwendet werden, Ich würde viel lieber eine Fehlermeldung, zumin genau dort, wo ich ein Objekt vom falschen Typ anführe, beschwere ich mich darüber, dass der Objekttyp falsch oder inkompatibel ist.

Wie gehen Sie in Ihrem Code mit diesen Situationen um? Wie erkennen Sie inkompatible Typen? Wie kann ich in meine Skripte eine Typüberprüfung einführen, damit ich Fehlermeldungen leichter verstehen kann?

Wie können Sie all dies während der Vererbung in PHP tun? 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 eigenen konkreten Klasse:

<?php 

class ConcreteClass extends InterfaceClass 
{ 
} 



?> 

ich ConcreteClass Instanzen wollen, und alle zukünftigen unbekannten benutzerdefinierten Objekte, auch akzeptabel sein zu SetObject. Wie würden Sie dies bei der Überprüfung des richtigen Typs zulassen?

Antwort

11

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

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

Dies funktioniert auch ordnungsgemäß mit Vererbung, wie Sie es erwarten würden.

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

4

als eine 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 eine array sowie liefern, falls ein Standardwert erwartet das Verfahren w/o beliebigen Parameter aufgerufen.

1

@Eran Galperin Die Antwort ist die bevorzugte Methode, um sicherzustellen, dass das von Ihnen verwendete Objekt vom richtigen Typ ist.

Bemerkenswert ist auch der Operator instanceOf - es ist hilfreich, wenn Sie überprüfen möchten, ob ein Objekt einer von mehreren Typen ist.

+0

Instanceof nützlich ist. Denken Sie daran, es nicht zu missbrauchen. –

0

Sie können die error_reporting ini Einstellung in Ihrem PHP einstellen.ini-Datei oder verwenden Sie error_reporting Funktion, um es in Laufzeit

1

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

Denken Sie daran, dass auch diese Art Fehler zur Laufzeit geworfen werden. Stellen Sie sicher, dass Sie Tests für den Code haben.

1

Selbst in dem Fall, den Sie beschreiben, wird Ihr Skript abstürzen und sich beschweren, dass es keine Methode/Attribut X auf dem Objekt Y gibt, damit Sie wissen, woher das kommt.

Wie auch immer, ich denke, dass immer versuchen, zu verhindern, dass Programmierer aufwachsen, um das falsche Objekt an eine Methode zu übergeben, ist keine gute Zeit Investition: Sie könnten es stattdessen in Dokumentation und Training ausgeben.

Ente tippen und sorgfältige Kollegen ist, was Sie brauchen, nicht zusätzliche Kontrollen, die Sie App steifer machen.

Aber es kann ein Pythonista Sicht ...

2

Für primitive Typen sein könnten Sie auch die is_ * Funktionen:

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