Melvin Cowznofski: $this-> und self:: in Klassen

Hallo,

Ich habe folgende Beispielklasse gegeben:


class Testklasse

	{

		private function vorarbeit()
			{
				$result = 1+1;
				return $result;
			}

		public function testfunktion()
			{
				$zahl = $this -> vorarbeit();
				$ergebnis = $zahl+1;
				return $ergebnis;
			}

	}

Im ausführenden PHP Skript steht:


$test = new Testklasse;
echo $test -> testfunktion();

Das funktioniert wunderbar. Wenn ich jetzt in der Methode "testfunktion" aus dem $zahl = $this -> vorarbeit(); ein $zahl = self :: vorarbeit(); mache, dann funktioniert es auch. Und das verstehe ich nicht. self:: sollte doch nur bei statischen Funktionen funktionieren. Wieso klappt das auch hier ohne Fehlermeldung und ohne Warnung?

Vielleicht ist ja wer so nett und erklärt mir, wieso das in dem Fall mit $this und mit self klappt, ich stehe grade komplett auf der Leitung.

Mit lieben Grüßen

Melvin Cowznofski

--
Melvin Cowznofski What – me worry?
  1. Hallo Melvin,

    Du hast einen Zombie entdeckt. Sprich: das, was Du hier tust, ist eigentlich tot, aber noch nicht unter der Erde. Nicht-statische Methoden sind bis zur aktuellen PHP Version auch statisch aufrufbar, kennen dann aber kein $this. Da du es in vorarbeit() nicht brauchst, fällt das nicht auf.

    Das ist offenbar ein PHP 4 Relikt, denn in PHP 5 gibt das eine E_STRICT Warnung und ab PHP 7 wird das zu E_DEPRECATED gesteigert. Zukünftige PHP Versionen können es ganz verbieten.

    Siehe in der PHP Doku dazu hier, Beispiel 2 auch und hier. Beim zweiten Link ist die deutsche Doku noch nicht auf dem Stand von PHP 7, daher der Link zur englischen Fassung.

    Gruß Rolf

    1. Tach!

      Das ist offenbar ein PHP 4 Relikt, denn in PHP 5 gibt das eine E_STRICT Warnung [...]

      Auch ist E_STRICT in den Default-Einstellungen ausgeklammert und zudem erst seit Version 5.4 in E_ALL enthalten. Statt E_ALL -1 zu verwenden schaltet am einfachsten alle Error-Level-Bits an.

      dedlfix.

      1. Hallo dedlfix,

        Statt E_ALL -1 zu verwenden schaltet am einfachsten alle Error-Level-Bits an.

        bei mir steht zu Beginn jeder PHP Ressource ein error_reporting(E_ALL|E_STRICT);, solange sie im Entwicklungszustand ist. Wie ist Dein Satz gemeint? Kann ich die Fehlermeldungen und Warnungen noch tiefer schrauben? Und wenn ja, wie?

        Mit lieben Grüßen

        Melvin Cowznofski

        --
        Melvin Cowznofski What – me worry?
        1. Tach!

          Statt E_ALL -1 zu verwenden schaltet am einfachsten alle Error-Level-Bits an.

          bei mir steht zu Beginn jeder PHP Ressource ein error_reporting(E_ALL|E_STRICT);, solange sie im Entwicklungszustand ist. Wie ist Dein Satz gemeint?

          Ein -1 wird beim üblicherweise verwendeten Zweierkomplement für vorzeichenbehaftete Integers durch eine Anzahl Bytes (je nach Größe zum Beispiel 4 oder 8) repräsentiert, bei denen alle Bits gesetzt sind. Man muss also nicht mehrere Werte mit jeweils einzeln gesetzten Bits verknüpfen, sondern kann für die gesamte Palette die Abkürzung -1 nehmen. E_ALL und Konsorten steht ja jeweils für diverse Zahlenwerte, die binär dargestellt, je ein bestimmtes Bitmuster ergeben.

          Kann ich die Fehlermeldungen und Warnungen noch tiefer schrauben? Und wenn ja, wie?

          Nicht tiefergehender als vom System vorgesehen. Du kannst auch die Dokumentation anschauen und alle Werte außer E_ALL (das ist schon zusammengesetzt) addieren oder or-verknüpfen, um zum selben Effekt zu kommen wie beim -1, bei dem eine Menge unausgewertete Bits zusätzlich gesetzt sind. Man müsste dazu aber immer beachten, dass das System im Laufe der Versionen erweitert wurde und im konkreten Fall auch das E_ALL anders sein kann. Mit -1 kürzt man das ab, wenn man wirklich alle möglichen und unmöglichen Werte abdecken möchte.

          Das System klappt in der Regel auch anderswo, solange nicht die Logik umgedreht wurde und ein Bit nicht gesetzt sein darf, um irgendetwas in seiner vollen Breite zu aktivieren.

          dedlfix.

    2. Hallo Rolf,

      vielen Dank für Deine Antwort! Na dann vergesse ich das doch rasch wieder und bleibe in diesem Fall beim $this, so wie es sich beim Aufruf für nicht statische Methoden gehört.

      Du hast einen Zombie entdeckt.

      Na super, und wie soll ich jetzt heute noch einschlafen können? :)

      Mit lieben Grüßen

      Melvin Cowznofski

      --
      Melvin Cowznofski What – me worry?