Tom: OOP: Konstanten definieren, Klassen vereinbaren

Hello,

zwei einfache Fragen an die Eingeweihten:

1. Wie definiert man in PHP OOP Konstanten?
2. Darf man _in_ Klassendefinitionen weitere Klassen definieren?

Zusatzfrage:

Wo gibt es ein umfassenderes Manual/Tutorial über die Möglichkeiten und Tricks von OOP - "unter besonderer Berücksichtigung der Möglichkeiten in PHP"?

Liebe Grüße aus http://www.braunschweig.de

Tom

--
Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
  1. Hallo,

    1. Wie definiert man in PHP OOP Konstanten?

    wie sonst auch?

    1. Darf man _in_ Klassendefinitionen weitere Klassen definieren?

    Obs geht weiss ich nicht, du solltest aber nicht machen.

    Wo gibt es ein umfassenderes Manual/Tutorial über die Möglichkeiten und Tricks von OOP - "unter besonderer Berücksichtigung der Möglichkeiten in PHP"?

    Welche PHP Version?

    gruß,
    Severin

    --
    Realität ist das, was nicht verschwindet, wenn man aufhört, daran zu glauben.
    --Philip K. Dick
    1. Moin!

      1. Wie definiert man in PHP OOP Konstanten?

      wie sonst auch?

      Eben. Allerdings würde ich vermuten, dass Konstanten in jedem Falle superglobal sind. Also keine korrekte Namensraumtrennung bei Konstanten möglich ist.

      1. Darf man _in_ Klassendefinitionen weitere Klassen definieren?

      Obs geht weiss ich nicht, du solltest aber nicht machen.

      Was geht, entscheidet immer noch der Parser. Wenn der sich nicht beschwert, wird es ok sein. Ich vermute aber, dass er sich beschwert. Man darf innerhalb von Funktionen ja auch keine Funktionen definieren.

      - Sven Rautenberg

      --
      Die SelfHTML-Developer sagen Dankeschön für aktuell 20065,57 Euro Spendengelder!
      1. Hello,

        1. Wie definiert man in PHP OOP Konstanten?

        wie sonst auch?

        Variablen werden explizit definiert mit "var"
        Da liegt doch die Vermutung nahe, dass es auch für Konstanten der Klasse eine eigene Definition gibt. Ich habe aber nun schon bestimmt 60 "Tutorials" für OOP in PHP durch. Erstens taugen die meisten nix und zweitens steht (wahrscheinlich deshalb) nix vernünftiges drin.

        Eben. Allerdings würde ich vermuten, dass Konstanten in jedem Falle superglobal sind. Also keine korrekte Namensraumtrennung bei Konstanten möglich ist.

        Irgendwo muss das doch mal nachzulesen sein *verflixt nochmal*

        1. Darf man _in_ Klassendefinitionen weitere Klassen definieren?

        Obs geht weiss ich nicht, du solltest aber nicht machen.

        Was geht, entscheidet immer noch der Parser. Wenn der sich nicht beschwert, wird es ok sein. Ich vermute aber, dass er sich beschwert. Man darf innerhalb von Funktionen ja auch keine Funktionen definieren.

        Ol, ich probiers gleich mal aus. Hab nur immer Angst, es abzuschießen. Da gabe es bei den älteren Versionen der 4.x-Klasse so ein paar nette Versuche, die ich durchgeführt habe, die dann eine Neuinstallation erforderlich gemacht haben (und das auf LINUX !)

        Liebe Grüße aus http://www.braunschweig.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        1. Hallo,

          1. Wie definiert man in PHP OOP Konstanten?
            Variablen werden explizit definiert mit "var"
            Da liegt doch die Vermutung nahe, dass es auch für Konstanten der Klasse eine eigene Definition gibt. Ich habe aber nun schon bestimmt 60 "Tutorials" für OOP in PHP durch. Erstens taugen die meisten nix und zweitens steht (wahrscheinlich deshalb) nix vernünftiges drin.

          In OOP, die wirklich und ausschließlich objektorientiert ist, kann es keine Konstanten geben, weil Konstanten nicht in das Konzept von Klassen und Objekten passen. Einen Wert, der unveränderlich und nur innerhalb einer Klasse gültig sein soll, würde man z.B. in Java als static final Variable innerhalb der Klasse definieren. Eine Konstante, die mehrere Klassen benutzen könnten wäre eine final Variable in einem Interface. PHP ist _nicht_ strict OOP. Es kombiniert konventionelle Programmierung mit OOP.

          1. Darf man _in_ Klassendefinitionen weitere Klassen definieren?

          In OOP allgemein: Ja. Das nennt sich Nested Classes. In PHP: keine Ahnung, glaube aber eher Nein ;-))

          viele Grüße

          Axel

        2. Hoi!

          1. Wie definiert man in PHP OOP Konstanten?
            Variablen werden explizit definiert mit "var"
            Da liegt doch die Vermutung nahe, dass es auch für Konstanten der Klasse eine eigene Definition gibt.

          In PHP 4 nicht, in PHP5 gibt es "const": http://de3.php.net/zend-engine-2.php

          Ich habe aber nun schon bestimmt 60 "Tutorials" für OOP in PHP durch. Erstens taugen die meisten nix und zweitens steht (wahrscheinlich deshalb) nix vernünftiges drin.

          Wieso? Was sollte denn drin stehen? Was fehlt Dir? Auf welchen Seiten hast Du so nach Tutorials gesucht?

          Eben. Allerdings würde ich vermuten, dass Konstanten in jedem Falle superglobal sind. Also keine korrekte Namensraumtrennung bei Konstanten möglich ist.

          Korrekt.

          Irgendwo muss das doch mal nachzulesen sein *verflixt nochmal*

          http://de3.php.net/define: " Auf eine Konstante überall zugegriffen werden kann, ohne allerdings den Auswertungsregeln von Variablen zu unterliegen;"
          wieso reicht Dir diese Aussage nicht? In dem Fall hätte ich noch fogendes anzubieten: http://de3.php.net/constants
          " Wie bei superglobals ist der Gültigkeitsbereich einer Konstanten global. Unabhängig vom Gültigkeitsbereich können Sie in Ihrem Skript überall auf eine Konstante zugreifen."

          1. Darf man _in_ Klassendefinitionen weitere Klassen definieren?

          Ich bin mir ziemlich (wenn auch nicht 100%ig) sicher das das weder in PHP4 noch in PHP5 geht.

          Ol, ich probiers gleich mal aus. Hab nur immer Angst, es abzuschießen. Da gabe es bei den älteren Versionen der 4.x-Klasse so ein paar nette Versuche, die ich durchgeführt habe, die dann eine Neuinstallation erforderlich gemacht haben (und das auf LINUX !)

          Ach ja, ich erinnere mich ;-)
          Das ist und blebt ein Rätsel für mich, habe sowas noch nie geschafft,  aber das liegt vermutlich daran dass Du damals mit einer sehr verbuggten (hoffentlich nicht 4.0.6?) Version gearbeitet hast. Ich glaube mit so alten Versionen habe ich nie gearbeitet, auf alle Fälle gab es schon PHP > 4.1 als ich damit angefangen habe.
          Naja, wenn man mit einem Syntax-Error PHP komplett abschießen könnte dann wär das ein ganz grober Bug! Und wäre mir nicht bekannt, aber versuchs doch einfach mal ;-)

          Grüße
          Andreas

      2. Hallo,

        Eben. Allerdings würde ich vermuten, dass Konstanten in jedem Falle superglobal sind. Also keine korrekte Namensraumtrennung bei Konstanten möglich ist.

        Das kann ich bestätigen:
        <?php
        define('BAR','Konst. Bar');

        class foo{
            function foo(){
            }
            function return_konst(){
                return BAR;
            }
        }
        echo BAR;
        $test = new foo();
        echo $test->return_konst();
        ?>

        Was geht, entscheidet immer noch der Parser. Wenn der sich nicht beschwert, wird es ok sein. Ich vermute aber, dass er sich beschwert. Man darf innerhalb von Funktionen ja auch keine Funktionen definieren.

        Jein. Folgender Code:
        <?php
        function foo(){
            function bar(){
                return 'func:bar';
            }
            echo bar();
            return 'func:foo';
        }

        echo foo();
        ?>
        wird 'func:barfunc:foo' ausgeben. Allerdings ist es nicht möglich die Funktion bar direkt aufzurufen. Ich meine, das hat damit zu tun, dass die Funktion nur im lokalen Scope von foo bekannt ist.

        gruß,
        Severin

        --
        Realität ist das, was nicht verschwindet, wenn man aufhört, daran zu glauben.
        --Philip K. Dick
        1. Moin!

          Was geht, entscheidet immer noch der Parser. Wenn der sich nicht beschwert, wird es ok sein. Ich vermute aber, dass er sich beschwert. Man darf innerhalb von Funktionen ja auch keine Funktionen definieren.

          Jein. Folgender Code:
          <?php
          function foo(){
              function bar(){
                  return 'func:bar';
              }
              echo bar();
              return 'func:foo';
          }

          echo foo();
          ?>

          Dein Code ist nicht ganz praxisnah. Versuche als Hauptprogramm mal folgendes:

          echo foo();
          echo foo();

          Dein Skript wird mit der Beschwerde abbrechen, dass die Funktion bar() doppelt definiert wurde. (Hoffe ich jetzt jedenfalls mal. :) )

          - Sven Rautenberg

          --
          Die SelfHTML-Developer sagen Dankeschön für aktuell 20065,57 Euro Spendengelder!
          1. Hallo,

            Dein Code ist nicht ganz praxisnah. Versuche als Hauptprogramm mal folgendes:

            Sollte er auch nicht sein; Es ging mir eher darum zu zeigen, dass der Parser auch 'falschen' Code schluckt.

            echo foo();
            echo foo();

            Dein Skript wird mit der Beschwerde abbrechen, dass die Funktion bar() doppelt definiert wurde. (Hoffe ich jetzt jedenfalls mal. :) )

            Das stimmt; allerdings könnte ich vorher einfach mittels if(!function_exists('bar')) prüfen ob die Funktion deklariert wurde, dann geht der Code wieder. SCNR ;-).

            gruß,
            Severin

            --
            Realität ist das, was nicht verschwindet, wenn man aufhört, daran zu glauben.
            --Philip K. Dick