Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] PHP funktion modifizieren

Einklappen

Neue Werbung 2019

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

  • [Erledigt] PHP funktion modifizieren

    Hallo zusammen,

    ich will eine eigene print_r() funktion schreiben und dachte mir das der einfachste weg eine modifizierte kopie des originals ist.

    Jetzt bin ich nach einigen recherchen auf folgenden code in der datei "extensions\standart\basic_functions_c" gestoßen

    PHP-Code:
    PHP_FUNCTION(print_r)
    {
        
    zval *var;
        
    zend_bool do_return 0;

        if (
    zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC"z|b", &var, &do_return) == FAILURE) {
            
    RETURN_FALSE;
        }

        if (
    do_return) {
            
    php_start_ob_buffer (NULL01 TSRMLS_CC);
        }

        
    zend_print_zval_r(var, 0 TSRMLS_CC);

        if (
    do_return) {
            
    php_ob_get_buffer (return_value TSRMLS_CC);
            
    php_end_ob_buffer (00 TSRMLS_CC);
        } else {
            
    RETURN_TRUE;
        }

    Ich kann jetzt nicht viel damit anfangen, daher generell erstmal die frage ob ich an der richtigen stelle suche. Ich habe irgendwie das gefühl ich habe mich irgendwo verlaufen.

    Edit: den code habe ich in den dateien gefunden die ich auf php.net heruntergeladen habe "PHP 5.3.3 (tar.gz)"

    Edit2: ich arbeite in der Regel mit xampp und habe daher keinen zugriff auf eine auf einem server installierte version

    Gruß
    Squall


  • #2
    Für mich sieht das oben eher so aus als ob du in PHP eine eigene Funktion integrieren willst!
    (Das woben sieht nach C(++|#) aus ?)

    Warum nicht einfach sowas:
    PHP-Code:
    function myPrint_r($var) {
        
    //...

    Grüße
    Signatur:
    PHP-Code:
    $s '0048656c6c6f20576f726c64';
    while(
    $i=substr($s=substr($s,2),0,2))echo"&#x00$i;"

    Kommentar


    • #3
      Zitat von Squall Beitrag anzeigen
      ich will eine eigene print_r() funktion schreiben und dachte mir das der einfachste weg eine modifizierte kopie des originals ist.
      Ich würde sagen, dass der beste Weg der ist, dass du dir erst mal aufschreibst, was diese Funktion leisten soll, und welche Sonderfälle sie zu berücksichtigen hat.


      Ich kann jetzt nicht viel damit anfangen, daher generell erstmal die frage ob ich an der richtigen stelle suche.
      Das ist C/C++-Code.
      Wenn du damit nichts anfangen kannst - dann wird er dir auch nicht viel weiter helfen.

      Kommentar


      • #4
        Prinzipiell bist du richtig, allerdings siehts so aus, als ob die eigentliche Implementation hier zu finden ist:
        PHP-Code:
         zend_print_zval_r(var, 0 TSRMLS_CC); 
        Aaaaaaber - ich würde auch nicht im C Sourcecode rumbasteln, wenn du nicht genau weisst, was du tust.
        Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

        Kommentar


        • #5
          Zitat von Squall Beitrag anzeigen
          Hallo zusammen,

          ich will eine eigene print_r() funktion schreiben ...
          Erste Frage: Wozu? Zu Übungszwecken?
          Zweite Frage: Kennst du var_dump()?

          Hinweis: Beim Bauen einer solchen Funktion ist zu beachten, dass "zirkuläre Referenzen" auftreten können, die abgefangen werden müssen, damit die Funktion nicht in einer Endlosschleife hängen bleibt. Array A kann Array B enthalten und dieses wiederum eine Referenz auf Array A. Einfaches Beispiel:
          PHP-Code:
          // $GLOBALS enthält eine Referenz auf sich selbst 
          print_r($GLOBALS); 
          Man bekommt die Erkennung dieses Problems in reinem PHP nur mit Tricksereien hin.

          ... und dachte mir das der einfachste weg eine modifizierte kopie des originals ist.
          Aha.

          Jetzt bin ich nach einigen recherchen auf folgenden code in der datei "extensions\standart\basic_functions_c" gestoßen ...
          Das ist der C-Quellcode. Den kannst du für deine PHP-Experimente nur als Anschauungsmaterial gebrauchen.

          Bessere Beispiele findest du auf den Seiten von PHP.net:
          PHP: var_dump - Manual
          PHP: print_r - Manual

          Var_Dump
          Wenn man die Wurst schräg anschneidet, hält sie länger, weil die Scheiben größer sind.

          Kommentar


          • #6
            @ByStones:
            Genau dass habe ich vor, damit ich aber myPrint_r() schreibe will ich wissen was print_r() macht dass dann copy&paste und dann nur noch modifizieren.

            @ChrisB
            Ich will mir eigentlich nur noch zusätzlich den datentyp (string, array, bool etc.) ausgeben lassen und dachte dass halt irgendwo im core sowas ähnliches steht wie:

            PHP-Code:
            function print_r($var$return false) {
                
            // irgend ein php code den ich kopieren kann

            liege ich mit der annahme falsch?

            Kommentar


            • #7
              Ja, damit liegst du falsch. Core-Funktionen liegen nicht als PHP Code vor.
              Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

              Kommentar


              • #8
                Ja, da print_r eigentlich in C geschrieben ist.
                Signatur:
                PHP-Code:
                $s '0048656c6c6f20576f726c64';
                while(
                $i=substr($s=substr($s,2),0,2))echo"&#x00$i;"

                Kommentar


                • #9
                  Dann vergesse ich mein vorhaben ganz schnell wieder

                  Danke euch allen

                  Kommentar


                  • #10
                    Ja, da liegst Du falsch. Das, was Du willst, wird genau von var_dump in Verbindung mit xdebug erfüllt.

                    Bevor Du anfängst, im PHP-Source-Code rumzufummeln, lass Dir gesagt sein, dass das nicht trivial ist und dass Du zum Schluss außerdem das Ganze noch für Deine Maschine kompilieren musst.

                    Ich verstehe auch nicht, wo das Problem ist, die Funktion - wenn überhaupt - in PHP nachzubauen und anzupassen..


                    EDIT: 4 Antworten, während ich geschrieben habe... mannmannmann

                    Kommentar


                    • #11
                      Zitat von Squall Beitrag anzeigen
                      Ich will mir eigentlich nur noch zusätzlich den datentyp (string, array, bool etc.) ausgeben lassen
                      Dann nimm das bereits erwähnte var_dump.

                      Das ist übrigens auf der Handbuchseite zu print_r bereits verlinkt - also schau dich doch bitte das nächste mal erst mal ein bisschen um, bevor du das Rad neu erfinden willst.

                      Kommentar


                      • #12
                        Zitat von xm22 Beitrag anzeigen
                        Das, was Du willst, wird genau von var_dump in Verbindung mit xdebug erfüllt.
                        xdebug sagt mir leider nichts. Mein problem lag darin das mir print_r keine bolean werte ausgibt. Bei true gibt er 1 aus und bei false nichts. Ich wollte aber die gut lesbare ausgabe von:

                        PHP-Code:
                        print '<pre>'print_r($var); print '</pre>'
                        beibehalten. Daher mein gedanke ich verändere das ganze ein bisschen baue noch ein highlighting ein und dann währe das ganze mit wenig arbeit für mich wesentlich lesbarer gewesen. Da ich aber keine ahnung von C habe werde ich mir wohl bei gelegenheit eine eigene funktion schreiben müssen.

                        Zitat von ChrisB Beitrag anzeigen
                        Dann nimm das bereits erwähnte var_dump.

                        Das ist übrigens auf der Handbuchseite zu print_r bereits verlinkt - also schau dich doch bitte das nächste mal erst mal ein bisschen um, bevor du das Rad neu erfinden willst.
                        Ich kenne var_dump() ich empfinde nur dessen ausgabe als schwer lesbar

                        Kommentar


                        • #13
                          Zitat von Squall Beitrag anzeigen
                          Ich kenne var_dump() ich empfinde nur dessen ausgabe als schwer lesbar
                          Hm, kann ich nicht nachvollziehen.

                          Höchstens, wenn du zu viele Daten auf einmal damit betrachtest - dann solltest du vielleicht mit deinen Debug-Ausgaben eine/mehrere Ebenen tiefer ansetzen: Kein komplettes 27-dimensionales Array auf einmal ausgeben lassen, sondern gezielt einen Eintrag auf Ebene 23 o.ä.

                          Kommentar


                          • #14
                            Daher mein gedanke ich verändere das ganze ein bisschen baue noch ein highlighting ein
                            Du könntest print_r/var_dump nehmen und den Output mit preg_match so umbauen dass du Highlightning usw einbauen kannst.

                            Ich kenne var_dump() ich empfinde nur dessen ausgabe als schwer lesbar
                            Kann ich nur zustimmen, ich finde var_dump sieht wie so ein fetter Brocken aus, print_r hingegen sieht iwie luftiger aus...

                            var_dump
                            Code:
                            array(2) {
                              [0]=>
                              array(2) {
                                [0]=>
                                string(4) "hans"
                                [1]=>
                                string(5) "peter"
                              }
                            }
                            print_r
                            Code:
                            Array
                            (
                                [0] => Array
                                    (
                                        [0] => hans
                                        [1] => peter
                                    )
                            
                            )
                            Wenn man Objekte nimmt ist es sogar noch schlimmer...
                            Signatur:
                            PHP-Code:
                            $s '0048656c6c6f20576f726c64';
                            while(
                            $i=substr($s=substr($s,2),0,2))echo"&#x00$i;"

                            Kommentar


                            • #15
                              Die Ausgabe von var_dump kann man aber so umbauen, dass es luftiger wird. Z.B. bestimmte Umbrüche raus - sieht man ja im obigen Beispiel gut.

                              [edit]

                              Hier. Die Klammern dürft Ihr Euch selbst hinpfriemeln:
                              PHP-Code:
                                protected static function printStructuredVardumpExtend ($mVar)
                                  {
                                  
                              ob_start ();
                                  
                              var_dump ($mVar);
                                  
                              //$sOut  = ob_get_contents ();
                                  
                              $sOut  preg_replace ('/=\>[' PHP_EOL ']+[\t\040]*([^' PHP_EOL ']*)/' ' => $1' ob_get_contents ());
                                  
                              ob_end_clean ();
                                  return (
                              htmlspecialchars ($sOut));
                                  } 
                              --

                              „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                              Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                              --

                              Kommentar

                              Lädt...
                              X