crille: OOP: Typisierung von Klassenattributen

Moin Moin!

Nachdem ich jahrelang mit Notepad++ PHP geschrieben habe, bin ich nun dazu übergegangen mit NetBeans eine IDE zu benutzen. Allerdings bin ich dort auf ein Problem gestoßen:
Ich habe eine Klasse Erde und eine Klasse Sonnensystem. In der Klasse Sonnensystem soll es u.a. ein Attribut $erde geben:

class Sonnensystem{  
    var $erde;  
    ...  
  
    function __construct($erde, ...) {  
         $this->erde = $erde;  
         ...  
     }  
  
    function gebReihenfolgeDerPlanetenAbSonne() {  
         $arrayEntfernung =  
         ($this->erde->name => $this->erde->avgEntfernungZurSonne,  
         ...) ;  
         ...  
     }  
}  

Jetzt ist allerdings nirgendwo spezifiziert, dass $this->erde eine Instanz der Klasse Erde ist. Mir ist zwar bei der Recherche TypeHinting begegnet, allerdings kann ich ja nur im Konstruktor TypeHinting vornehmen, so dass nur dort definiert ist, dass $erde eine Instanz der Klasse Erde ist.

Kann ich irgendwie festlegen, von welchen Typ $this->erde ist? Sowas wie

class Sonnensystem{  
    var Erde $erde;  
    ...  
}

?!? Oder ist PHP in Sachen OOP und Typisierung doch noch nicht so weit?

Grüße
crille

  1. Hi!

    Jetzt ist allerdings nirgendwo spezifiziert, dass $this->erde eine Instanz der Klasse Erde ist.

    Solch eine Spezifikation kann PHP wegen seines Design-Prinzips auch nicht bindend vornehmen. Type-Hinting geht nur bei Funktionsaufrufen. Der Rest ist Selbstdisziplin. - Und PHPDoc-Kommentare, um den Lesern deines Codes die Bedeutungen von Klassen, Eigenschaften, Methoden und Parametern zu erklären. Solche Kommentare sind auch programmtechnisch auswertbar; einige IDEs machen dies.

    Lo!

    1. Vielen Dank für die Antworten. Ich werde es mal mit den PHPDoc-Kommentaren versuchen.

      Grüße
      crille

  2. Moin!

    Jetzt ist allerdings nirgendwo spezifiziert, dass $this->erde eine Instanz der Klasse Erde ist.

    Das kann man codemäßig auch nicht festlegen, jedenfalls nicht für das Attribut.

    Da man aber für vernünftig wart- und testbaren Code eine vernünftige Dependency Injection programmiert, wäre die Prüfung für den korrekten Typ von Erde im Sonnensystem-Konstructor zu platzieren. Im einfachsten Fall als Typehinting in der Parameterliste. Im kompliziereren Fall (Array von Planeten) wäre, wenn tatsächlich der Bedarf besteht, jedes einzelne Arrayelement auf korrekten Typ zu prüfen.

    Mir ist zwar bei der Recherche TypeHinting begegnet, allerdings kann ich ja nur im Konstruktor TypeHinting vornehmen, so dass nur dort definiert ist, dass $erde eine Instanz der Klasse Erde ist.

    PHP ist eine lose typisierte Sprache, und das ist auch gut so. Das Type-Hinting ist derzeit das Maximum an Möglichkeiten, das PHP von sich aus bietet. Wenn du mehr willst, steht es dir frei, an jeder Stelle eigene Typchecks einzuprogrammieren. Das wäre allerdings ziemlich übertrieben.

    Kann ich irgendwie festlegen, von welchen Typ $this->erde ist?

    Wenn es dir nur darum geht, dass NetBeans dir Autocompletion anbietet, solltest du dich mit PHPDOC-Kommentaren beschäftigen:

    /**  
     * @var Erde  
    **/  
    public $erde;  
    
    

    Mit diesem Kommentar teilst du allen interessierten Systemen (nicht nur, aber auch, der Autocompletion von NetBeans) mit, welchen Objekttyp man in der Variablen üblicherweise erwartet.

    Oder ist PHP in Sachen OOP und Typisierung doch noch nicht so weit?

    PHP ist weit genug, um damit sehr sehr gut arbeiten zu können. Aber es hat halt keine strikte Typisierung, weshalb alle Taktiken der OOP-Programmierung anderer Sprachen hier nicht so angewendet werden können.

    - Sven Rautenberg