Ankündigung

Einklappen
Keine Ankündigung bisher.

statische Eigenschaft einer unbekannten Klasse aufrufen

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • statische Eigenschaft einer unbekannten Klasse aufrufen

    Hallo,
    Wie kann ich die statische Eigenschaft abrufen, von dessen Klasse ich nur ein Objekt habe, ohne E_STRICT zu verletzen, das heißt die statische Eigenschaft auch wie eine Klasseneigenschaft und nicht wie eine Objekteigenschaft abzurufen (T_PAAMAYIM_NEKUDOTAYIM).

    Wie komme ich drauf?
    Ich habe eine abstrakte TextControl-Klasse, die eine statische factory-Methode hat, die je nach Parameter ein Objekt der TextControl_Mysql oder ein TextControl_Oci8 zurückliefert.

    In der abstrakten Klasse TextControl stehen einige protected static (also Klasseneigenschaften) Variablen mit Standard-SQL-Statements.

    Nun können TextControl_Oci8 oder TextControl_Mysql diese Standard-SQL-Statements durch spezifische überschreiben und an genau diese möchte ich jetzt von außen heran.

    (Allerdings nur zu Debug-Zwecken und aus Interesse)

    PHP-Code:
    <?php
    $tc 
    TextControl::factory($db);
    echo 
    $tc->$sql_langExists// Aufruf als Objekteigenschaft, verletzt E_STRICT
    echo TextControl_Mysql::$sql_langExists// das möchte ich (wenn get_class($tc) = TextControl_Mysql wäre)
    echo get_class($tc)::$sql_langExists// geht nicht
    $class get_class($tc);
    echo 
    $class::$sql_langExists// T_PAAMAYIM_NEKUDOTAYIM-Fehler
    echo {$class}::$sql_langExists// {-Parse-Error;
    ?>
    Achso: Ohne eval() oder Reflections.

  • #2
    hi,

    gibt es die variable $sql_langExists? denn

    PHP-Code:
    $sql_langExists='test';
    $tc->$sql_langExists
    würde $tc->test aufrufen (variabler klassen var aufruf)

    andererseits würde

    PHP-Code:
    echo TextControl_Mysql::$sql_langExists
    die variable $sql_langExists von TextControl_Mysql aufrufen

    p.s.: wenn das dein code ist, einige dich beim coden ob du kleinGross oder klein_gross schreibst, aber nicht vermischen....
    [B]PHP4?!?[/B]>>>[B]Aktuelle[/B] PHP Version: [B]5.2.11 || 5.3.0
    [URL="http://en.opensuse.org/Factory/News"]Suse 11.2 *vorfreude*[/URL]
    [/B]

    Kommentar


    • #3
      Die Klasseneigenschaft heißt sql_langExists, wird also wie folgt definiert
      PHP-Code:
      <?php
      protected static $sql_langExists "..";
      ?>
      würde $tc->test aufrufen (variabler klassen var aufruf)
      Stimmt hast du Recht, weiß ich eigentlich, ging da jetzt auch nur unter im Testmarathon.

      wenn das dein code ist, einige dich beim coden ob du kleinGross oder klein_gross schreibst, aber nicht vermischen....
      Sollte deutlicher abgrenzen, aber hast du Recht.


      Geht mir jetzt auch grundsätzlich nur darum ob es möglich ist. Ich denke nein oder?
      call_user_func() läßt sich ja nicht zum Eigenschaften auslesen mißbrauchen oder?

      Kommentar


      • #4
        Zitat von Zergling
        Geht mir jetzt auch grundsätzlich nur darum ob es möglich ist. Ich denke nein oder?
        call_user_func() läßt sich ja nicht zum Eigenschaften auslesen mißbrauchen oder?
        ohne eval und ohne reflection? nein, ich hab auch ein bisschen was probiert, aber nö hab auch nur fehler bekommen.
        [B]PHP4?!?[/B]>>>[B]Aktuelle[/B] PHP Version: [B]5.2.11 || 5.3.0
        [URL="http://en.opensuse.org/Factory/News"]Suse 11.2 *vorfreude*[/URL]
        [/B]

        Kommentar


        • #5
          OK danke für deine Meinung, habe u.a. die Variablen entsprechend umbenannt

          Kommentar


          • #6
            Da wars wieder. eval () oder verzweifeln, such Dir was aus.
            Ich hatte ja neulich nen Hoffnungsschimmer, als Doc E. mir diese simple Klammervariante ( $sClassname::{$sMethodname}; ) vorgeschlagen hat. Manchmal sind die einfachsten Notationen ja diejenigen, die man übersieht. Aber leider - Pustekuchen. Falls das überhaupt funktioniert, dann nur für statische Methoden.
            [COLOR="#F5F5FF"]--[/COLOR]
            [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
            „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
            [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
            [COLOR="#F5F5FF"]
            --[/COLOR]

            Kommentar


            • #7
              Hallo nikosch77,

              da ihr hier alle schon so verzweifelt seit, hier ein Stück Code, das ich so ähnlich in meinem PageController habe. Und der funktioniert.

              PHP-Code:
              <?php
                 
              class testclass
                 
              {

                    function 
              testclass(){
                    }

                    function 
              mymethod(){
                       return 
              'mymethod';
                    }

                 }

                 
              $classname 'testclass';
                 
              $method 'mymethod';

                 
              $object = new $classname;
                 echo 
              $object->{$method}();
              ?>
              Ich sollte mir ein "eval = evil" in die Signatur schreiben.
              Viele Grüße,
              Dr.E.

              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
              1. Think about software design [B]before[/B] you start to write code!
              2. Discuss and review it together with [B]experts[/B]!
              3. Choose [B]good[/B] tools (-> [URL="http://adventure-php-framework.org/Seite/088-Why-APF"]Adventure PHP Framework (APF)[/URL][URL="http://adventure-php-framework.org"][/URL])!
              4. Write [I][B]clean and reusable[/B][/I] software only!
              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

              Kommentar


              • #8
                Und wiederum bleibt zu sagen: es geht hier um den Zugriff auf ein statisches Klassenmember, nicht auf eine Methode.

                PHP-Code:
                <?php

                class testclass
                   
                {
                   static 
                $testmember 1;

                   static function 
                testmethod()
                      {
                      echo 
                self::$testmember;
                      }
                   }


                $classname 'testclass';
                $testmethod 'testmethod';


                // funktioniert
                testclass::$testmember 2;

                // funktioniert nicht
                // $classname::$testmember = 3;

                // funktioniert nicht
                // $classname::{$testmember} = 4;



                // funktioniert
                testclass::testmethod ();

                // funktioniert nicht
                // $classname::testmethod ();

                // funktioniert nicht
                // $classname::{$testmethod}();

                // funktioniert nicht
                // testclass::{$testmethod}();

                // funktioniert
                testclass::${testmethod}();

                ?>
                [COLOR="#F5F5FF"]--[/COLOR]
                [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
                „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
                [COLOR="#F5F5FF"]
                --[/COLOR]

                Kommentar


                • #9
                  Zitat von nikosch77
                  Und wiederum bleibt zu sagen: es geht hier um den Zugriff auf ein statisches Klassenmember, nicht auf eine Methode.
                  jap und wie du in deinem beispiel zeigst, kennt er den klassennamen nicht.
                  [B]PHP4?!?[/B]>>>[B]Aktuelle[/B] PHP Version: [B]5.2.11 || 5.3.0
                  [URL="http://en.opensuse.org/Factory/News"]Suse 11.2 *vorfreude*[/URL]
                  [/B]

                  Kommentar


                  • #10
                    Ich habe das Beispiel auf deinen letzten Satz gepostet, sorry da muss ich wohl einen Teil überlesen haben. Hier würde sich dann evtl. anbieten eine statische Wrapper-Methode zu implementieren, die einen Klassenmember ausliest. Dann klappt mein Beispiel auch. Mehr fällt mir nicht mehr ein und ich halte jetzt besser meinen Mund.
                    Viele Grüße,
                    Dr.E.

                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                    1. Think about software design [B]before[/B] you start to write code!
                    2. Discuss and review it together with [B]experts[/B]!
                    3. Choose [B]good[/B] tools (-> [URL="http://adventure-php-framework.org/Seite/088-Why-APF"]Adventure PHP Framework (APF)[/URL][URL="http://adventure-php-framework.org"][/URL])!
                    4. Write [I][B]clean and reusable[/B][/I] software only!
                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

                    Kommentar


                    • #11
                      Es hatte eigentlich keinen Sinn gemacht, die Werte als Klasseneigenschaften zu implementieren, nur weil ich davon ausgegangen bin, dass die Klasse nur einmal instanziert werden darf (Singleton).
                      Das rechtfertigt noch keinen Einsatz von statischen Eigenschaften. Somit sind alle wieder Objekteigenschaften und $tc->xy klappt wunderbar.

                      Trotzdem irgendwie merkwürdig. Gleiches hatte ich ja mal für die Instanzierung einer Klasse mit variabler Anzahl Parametern für den Konstruktor gesucht.

                      Code:
                      $object = new $class();
                      $object = new $class($one, $two);
                      .. alles kein Problem, nur wie wenn ich nicht weiß wieviele Parameter kommen?

                      call_user_func_array() ging ja auch nicht. Bis Reflections mit
                      Code:
                      $reflection = new ReflectionClass($class);
                      $object = $reflection->newInstanceArgs($args);
                      die Lösung brachte, endlich kein eval().
                      Aber beruht wohl letztlich alles etwas auf Design-Fehlern. Danke für euren Gehirnschmalz

                      Kommentar


                      • #12
                        Hola,

                        bin eben über etwas gestolpert, was vll. das ursprüngliche Probleme lösen könnte:

                        Dynamic static calls: $c = "classname"; $c::someMetod();
                        Quelle: http://schlueters.de/blog/archives/5....3-update.html

                        Leider konnte ich noch nichts genaueres zur Funktionsweise finden.


                        Bis dääähne.

                        Kommentar


                        • #13
                          Zitat von squig
                          Hola,

                          bin eben über etwas gestolpert, was vll. das ursprüngliche Probleme lösen könnte:

                          Dynamic static calls: $c = "classname"; $c::someMetod();
                          Quelle: http://schlueters.de/blog/archives/5....3-update.html

                          Leider konnte ich noch nichts genaueres zur Funktionsweise finden.


                          Bis dääähne.
                          trifft sich gut, ist also für php 5.3 und php 6 vorgesehen...
                          [B]PHP4?!?[/B]>>>[B]Aktuelle[/B] PHP Version: [B]5.2.11 || 5.3.0
                          [URL="http://en.opensuse.org/Factory/News"]Suse 11.2 *vorfreude*[/URL]
                          [/B]

                          Kommentar


                          • #14
                            Re: statische Eigenschaft einer unbekannten Klasse aufrufen

                            Ja. Mal abgesehen davon, dass das ursprüngliche Problem, nach dem Zugriff auf eine statische Eigenschaft einer Klasse mit dynamischen Klassennamen fragt:

                            Zitat von Zergling
                            Hallo,
                            Wie kann ich die statische Eigenschaft abrufen, von dessen Klasse ich nur ein Objekt habe, ohne E_STRICT zu verletzen, das heißt die statische Eigenschaft auch wie eine Klasseneigenschaft und nicht wie eine Objekteigenschaft abzurufen (T_PAAMAYIM_NEKUDOTAYIM).
                            Zitat von squig
                            $c::someMetod();
                            [COLOR="#F5F5FF"]--[/COLOR]
                            [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
                            „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                            [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
                            [COLOR="#F5F5FF"]
                            --[/COLOR]

                            Kommentar


                            • #15
                              Naja ich nehme an, dass dann der Zugriff auf statische Eigenschaften genauso abläuft. Würde zumindest Sinn machen.

                              Kommentar

                              Lädt...
                              X