am 27. August 2009
Heute möchte ich ein wenig übe rein Phänomen reden, dass ich in letzter Zeit immer häufiger sehe. Undefinierte Attribute. Ich nenne es mal so, keine Ahnung, ob es dazu einen Fachausdruck gibt. Auf jeden Fall meine ich Instanzvariablen, die nicht definiert wurden, aber mit denen hantiert wird.
Natürlich habe ich auch gleich ein kleines Beispiel:
class Foo
{
function setVar( $value )
{
$this->var = $value;
}
}
Rein technisch gesehen, würde ich sagen, dass dies identisch mit der folgenden Klasse ist.
class Foo
{
public $var = null;
function setVar( $value )
{
$this->var = $value;
}
}
Das erste Beispiel ist kürzer und hat trotzdem die gleiche Funktionalität. PHP macht es möglich. Leider.Wenn man die beiden vergleicht, dann würde man ganz naiv sagen, dass die erste Variante vorzuziehen ist, da sie weniger komplex scheint. Was macht man aber, wenn mit statischer Codeanalyse arbeiten will? Ich habe ja gar keine Ahnung, ob die Variable $this->var existiert oder ob das ein Fehler in der Programm ist. Vertipper könnte ich so zum Beispiel nicht finden (schreibe übrigens gerade an einem Code Sniffer Sniff dafür). Auch die IDE kann mir nicht helfen. Dank PHPDoc könnte ich nämlich im zweiten Fall meiner Entwicklungsumgebung sagen, was für ein Typ die Variable $var ist. Und da ich sehr viel mit meiner IDE mache, wäre das für mich schon das K.O. Kriterium.
Dabei habe ich aber immer ein Problem. PHP erlaubt viele Dinge, die ich für relativ unsauber halte. __set und __get gehören auch zu dieser Spezies. Diese beiden magischen Methoden gehören aber fest zu PHP hinzu. Ich würde sie nur im Notfall verwenden. Trotzdem würde ich sie niemals verbieten.Genau so ist es auch bei diesem Beispiel. PHP ist so konstruiert worden, dass man so etwas machen kann. Es ist also jedem selbst überlassen, ob er seine Attribute vorher definiert.
Dummerweise ist auch gerade 1 Uhr nachts und ich habe keine Lust mehr ein Beispiel aus irgendeinem Produktivcode zu suchen, deswegen müsst ihr euch jetzt mal mit meinem hinkenden zufrieden geben.