What ist this?
Laut PHP-Doku ist das Verhalten der Pseudo-Variablen $this
wie folgt:
$this is a reference to the calling object (usually the object to which the method belongs, but can be another object, if the method is called statically from the context of a secondary object).
Schauen wir uns folgendes Beispiel an:
class A{ function __construct(){ $this->name = 'A'; } function echoThisName(){ echo "My Name is {$this->name}.\n"; } }
Jetzt rufen wir die Methode mal als Instanzmethode und mal statisch auf:
$a = new A(); $a->echoThisName(); A::echoThisName(); My Name is A. PHP Fatal error: Using $this when not in object context in /Users/aljoscha/test.php on line 9 Fatal error: Using $this when not in object context in /Users/aljoscha/test.php on line 9
Das ist vernünftig. (ausser: Warum muss sich PHP eigentlich immer wiederholen? Ist eine Fehlermeldung zu subtil?)
Jetzt rufen wird diese Methoden aus einer anderen Klasse B
heraus auf:
class B{ function __construct(){ $this->name = 'B'; } function echoAsName(){ $a = new A(); $a->echoThisName(); A::echoThisName(); } } $b = new B(); $b->echoAsName();
Und das gibt:
My Name is A. My Name is B.
Wir haben die Methode echoThisName
der Klasse A
statisch aufgerufen, aber $this
ist darin trotzdem gesetzt, und zwar als wären wir in der Instanz $b
der Klasse B
.
$b
hat sich die statische Methode gekapert.
Was sagt Ruby dazu?
class A def initialize @name = 'A'; end def echoThisName puts "My Name is #{@name}.\n"; end end $a = A.new; $a.echoThisName; A::echoThisName;
ergibt:
My Name is A. test.rb:13: undefined method `echoThisName' for A:Class (NoMethodError)
Rufen wir A::echoThisName
aus einer Instanz von B
auf:
class B def initialize @name = 'B'; end def echoAsName $a = A.new; $a.echoThisName; A::echoThisName; end end $b = B.new; $b.echoAsName;
Ist das Ergebnis entsprechend:
My Name is A. test.rb:23:in `echoAsName': undefined method `echoThisName' for A:Class (NoMethodError) from test.rb:28
Besser.
Dank an Stephan für den Hinweis auf die Dokumentation des Verhaltens in PHP.