Ankündigung

Einklappen
Keine Ankündigung bisher.

Prüfen oder ermitteln ob ein Objekt eine *RECURSION* ist.

Einklappen

Neue Werbung 2019

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

  • Prüfen oder ermitteln ob ein Objekt eine *RECURSION* ist.

    Hallo zusammen

    Ich möchte gerne prüfen oder ermitteln ob ein Objekt eine *RECURSION* ist, wie man es bei var_dump() oder print_r() antrifft.


    PHP-Code:
    $object = new Foo();

    // go through objects properties.            
    $reflectionClass = new ReflectionClass(get_class($object));

    foreach(
    $reflectionClass->getProperties() as $property) {

        
    $property->setAccessible(true);
        
    $propValue $property->getValue($object);

        
    // check if value is recursion

        
    $property->setAccessible(false);


    Leider hat die Reflection nicht solch eine Methode. Müsste ich denn die Objekte zwischenspeichern und dann diese vergleichen? Oder gibt es da andere Ansätze?
    Besten Dank im voraus.

    Vergleichsbeispiel:
    PHP-Code:
    $objectA = new Foo();
    $objectB = new Foo();

    if (
    $objectA === $objectB) {
        
    // is recursion


  • #2
    Zitat von strub Beitrag anzeigen
    Ich möchte gerne prüfen oder ermitteln ob ein Objekt eine *RECURSION* ist, wie man es bei var_dump() oder print_r() antrifft.
    Verstehe nur Bahnhof. Vermute, du meinst nicht Rekursion (s.Wiki), sondern etwas anderes. Was möchtest du vergleichen?

    Vermute, du suchst dies hier:
    Objekte vergleichen

    Wenn man den Vergleichsoperator (==) benutzt, werden Objektvariablen auf einfache Weise verglichen, d.h.: Zwei Objektinstanzen sind gleich, wenn sie die gleichen Attribute mit dem selben Wert (verglichen mit ==) haben und Instanzen der selben Klasse sind.

    Wenn man den Identitätsoperator benutzt (===), sind zwei Objekte identisch, genau dann, wenn sie die selbe Instanz der selben Klasse referenzieren.

    Kommentar


    • #3
      Was ist mit *RECURSION* gemeint? Ich kenne nur https://de.wikipedia.org/wiki/Rekursion und da erkenne ich keinen Zusammenhang.

      edit: jspit war schneller.

      Kommentar


      • #4
        *RECURSION* eben

        PHP-Code:
        <?php

        $recursion 
        = [
            
        'a',
            
        'b',
        ];
        $recursion['c'] =& $recursion;

        print_r($recursion);

        /*
        Array
        (
            [0] => a
            [1] => b
            [c] => Array
         *RECURSION*
        )
        */
        strub wenn du das von Hand machen willst hilft dir spl_object_hash() vllt. weiter.
        [I]You know, my wife sometimes looks at me strangely. „Duncan“, she says, „there's more to life than Solaris“. Frankly, it's like she speaks another language. I mean, the words make sense individually, but put them together and it's complete nonsense.[/I]

        Kommentar


        • #5
          und wie soll ein Object eine Recursion sein ?

          Kommentar


          • #6
            Ach komm, bisschen Fantasie bitte...

            PHP-Code:
            <?php

            $recursion 
            = new StdClass;
            $recursion->'b';
            $recursion->$recursion;
            print_r($recursion);

            /*
            stdClass Object
            (
                [a] => b
                [c] => stdClass Object
             *RECURSION*
            )
            */
            [I]You know, my wife sometimes looks at me strangely. „Duncan“, she says, „there's more to life than Solaris“. Frankly, it's like she speaks another language. I mean, the words make sense individually, but put them together and it's complete nonsense.[/I]

            Kommentar


            • #7
              Interessant, ist mir vorher noch nie begegnet.
              Dann sollte ein strikter Vergleich (===) zur Erkennung ausreichen:

              PHP-Code:
              <?php
              $recursion 
              = new StdClass;
              $recursion->'b';
              $recursion->$recursion;
              print_r($recursion);
              var_dump($recursion->=== $recursion);

              /*  
              stdClass Object (
                  [a] => b
                  [c] => stdClass Object
               *RECURSION* )
              bool(true)
              */

              Kommentar


              • #8
                Hey danke euch allen für die tollen Hinweise.

                PHP-Code:
                spl_object_hash() 
                Habe ich mir angeschaut, so wie ich es aber aus dem ersten Komment entnehme, werden die objekte nicht differenziert.

                Vielleicht lass ich es lieber sein, scheint kompliziert zu werden wie ich es auch vermutet habe
                Denn die Arrays müsste ich ja auch prüfen.

                War für mein variable Debugger gedacht. Ist aber nicht zwingend nötig.

                Danke trotzdem allen.

                Kommentar


                • #9
                  Ja, aber genau das willst du doch, das SELBE Objekt erkennen.
                  [I]You know, my wife sometimes looks at me strangely. „Duncan“, she says, „there's more to life than Solaris“. Frankly, it's like she speaks another language. I mean, the words make sense individually, but put them together and it's complete nonsense.[/I]

                  Kommentar


                  • #10
                    Ja das mit den Objekten scheint auch zu funktionieren. Aber wie schaut es den mit denn arrays aus? Wie bei deinem Beispiel.
                    Darum mach lieber bei meiner Shop Extension weiter, da gibt es noch viel zu tun

                    Kommentar


                    • #11
                      Zitat von chorn Beitrag anzeigen
                      Ach komm, bisschen Fantasie bitte...
                      Ich mag ja den Punkt nicht erkennen, aber Du tested eine Property und kein Object.

                      Kommentar


                      • #12
                        Das mal so als gaaaaanz groben Ansatz: https://eval.in/1017025.
                        [SIZE="1"]Atwood's Law: any application that can be written in JavaScript, will eventually be written in JavaScript.[/SIZE]

                        Kommentar


                        • #13
                          Zitat von strub Beitrag anzeigen

                          War für mein variable Debugger gedacht. Ist aber nicht zwingend nötig.

                          Kannst dir ja sonst mal https://symfony.com/components/VarDumper anschauen.

                          Kommentar


                          • #14
                            Mir sind solche Art von Rekursionen auch noch nicht unter gekommen. Können aber verdammt nerven, wie das folgende Beispiel zeigt:
                            PHP-Code:
                            $a = new \stdClass;
                            $b = new \stdClass;
                            $a->$b;
                            $b->$a;

                            $bool $a == $b;
                            //Fatal error: Nesting level too deep - recursive dependency? 
                            Hier erzeugt schon ein simpler typeschwacher Objektvergleich einen Fatal error. Der Vergleich per === dagegen nicht.

                            Das Thema war ja zu prüfen, ob ein Object eine **RECURSION** enthält.

                            Hier mein Ansatz/Versuch (PHP >= 5.5):
                            PHP-Code:
                            function isRecursive($obj){
                              return 
                                
                            json_encode($obj) === false AND
                                
                            json_last_error() == JSON_ERROR_RECURSION
                              
                            ;

                            Anwendbar für Objekte und Arrays.

                            Zitat von Zeichen32 Beitrag anzeigen
                            Kannst dir ja sonst mal https://symfony.com/components/VarDumper anschauen.
                            Dein Ernst, so was soll jemand für natives PHP verwenden? Hab es mir mal grob angeschaut.
                            Außer das dies extremen kompliziert ist und mit großen Aufwand verbunden ist konnte ich da leider nichts mitnehmen.

                            Kommentar


                            • #15
                              Hey lottikarotti, danke für deinen groben Ansatz.

                              Hey jspit, auch sehr guter Ansatz. Danke. Muss ich mal testen, vorallem die Performance.

                              Ja das Problem mit var_dump(), print_r() und den meisten anderen Dumpern ist, das ich bei manchen einen memory limit error erhalte oder einfach langes laden verursacht um die Daten zu sammeln. Deshalb habe ich mir meinen eigenen Dumper/Debuger gemacht, welchen eine depth limit enthält, um eben genau dieses Problem zu lösen.

                              Kommentar

                              Lädt...
                              X