Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] ALLE möglichen Fehler abfangen für test-eval()? Try/Catch, aber wie?

Einklappen

Neue Werbung 2019

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

  • [Erledigt] ALLE möglichen Fehler abfangen für test-eval()? Try/Catch, aber wie?

    Hallo,

    ich habe folgendes vor:

    Es sollen Strings als Ressourcen definiert werden, in denen Platzhalter vorkommen. Diese Platzhalter sollen zur Laufzeit ersetzt werden.

    Die Notation der Platzhalter sollen "gültige Code Elemente" sein, also z.B. der Inhalt eines Array-Wertes.

    Ich dachte daran, den Code-Teil freizuschneiden (anhand von Start- und End Begrenzern) und dann den so erhaltenen Code per eval() auszuwerten.

    Nun kann es aber sein, dass ein Array gar nicht definiert ist oder dass man sich bei der definitiob des Code-Teils verschreibt ... was zu einem fatal error führt ...

    Nun wollte ich das (ungültiger Code im Platzhalter) per Try - Catch abfangen, aber es ist mir noch nicht geglückt.

    Weiss jemand eine Lösung?
    Ich muss PHP im Kontext Home Automation nutzen (Vorgabe Hersteller und nicht zu ändern). Da kommt es leider ggf. auf ms an. Deshalb manche "seltsame" Frage.

  • #2
    Ist das nicht genau das, was eine Template-Engine macht? -> Twig

    (Natürlich ohne eval und etwas sicherer)
    [QUOTE=nikosch]Macht doch alle was Ihr wollt mit Eurem Billigscheiß. Von mir aus sollen alle Eure Server abrauchen.[/QUOTE]

    Kommentar


    • #3
      Ich dachte daran, den Code-Teil freizuschneiden (anhand von Start- und End Begrenzern) und dann den so erhaltenen Code per eval() auszuwerten.
      Die Template-Enginge von Laravel, hat einen Compiler namens Blade, der diesem Grundgedanken folgt, ihn aber anders umsetzt. eval wird meines Wissens nach nicht genutzt.

      Das Vorgehen ist wie folgt: Blade nutzt reguläre Ausdrücke um "Blade-Syntax" zu erkennen und sie mit PHP-Synatax zu ersetzen, kompiliert (automatisch!) also Template-Dateien, die die Blade-Syntax benutzen (Beispiel: )
      Code:
      @if(1 == 2)
          <h1>Hallo {{ $name }}!</h1>
      @endif
      zu PHP-Dateien, die PHP-Syntax nutzen:
      PHP-Code:
      <?php if (== 2): ?>
          <h1>Hallo <?php echo $name?>!</h1>
      <?php endif; ?>
      Diese werden dann vermutlich inkludiert (habe ich nicht nachgeprüft aber muss ja).

      Das Prinzip ist jedenfalls relativ simpel.

      Kommentar


      • #4
        Danke für die Hinweise.

        Werde mir das mal genauer ansehen, in der Hoffnung, dass das zugrunde liegende Framework nicht zu umfangreich ist (Ladezeiten-Problematik) oder zumindest als DLL vorhanden ist (einmaliges Laden).

        Denn das Replacement soll ja zur Laufzeit geschehen, und, viele werden wieder sagen "uagh", es geht (immer noch) um Hausautomation und damit um möglichst kurze Latenzen ...

        php_check_syntax() käme meinem Wunsch ja recht nahe ... seltsam nur, dass fiese FN nur für files vorhanden ist und dass - entgegen dem, was der Name suggeriert - der code auch gleich ausgeführt wird.
        Ich muss PHP im Kontext Home Automation nutzen (Vorgabe Hersteller und nicht zu ändern). Da kommt es leider ggf. auf ms an. Deshalb manche "seltsame" Frage.

        Kommentar


        • #5
          Zitat von jwka61 Beitrag anzeigen
          Danke für die Hinweise.

          Werde mir das mal genauer ansehen, in der Hoffnung, dass das zugrunde liegende Framework nicht zu umfangreich ist (Ladezeiten-Problematik)
          Dafuer gibt es caching
          Zitat von jwka61 Beitrag anzeigen
          oder zumindest als DLL vorhanden ist (einmaliges Laden).
          wer windows als webserver umgebung nutzt, macht generell was falsch

          Zitat von jwka61 Beitrag anzeigen
          Denn das Replacement soll ja zur Laufzeit geschehen, und, viele werden wieder sagen "uagh", es geht (immer noch) um Hausautomation und damit um möglichst kurze Latenzen ...
          kurze latenzen und template engine ist nur eine Stelle, dann haengt es noch von deinem Server ab + deine JS/CSS Dateien diese 3 und noch weitere Aspekte beeinflussen die ladezeit

          Zitat von jwka61 Beitrag anzeigen
          php_check_syntax() käme meinem Wunsch ja recht nahe ... seltsam nur, dass fiese FN nur für files vorhanden ist und dass - entgegen dem, was der Name suggeriert - der code auch gleich ausgeführt wird.
          warum php_check_syntax()?? wtf?? wenn du dein scriptaufrufst, checkt der interpreter die syntax, was versuchst du hier zu tun??
          apt-get install npm -> npm install -g bower -> bower install <package> YOLO [URL]https://www.paypal.me/BlackScorp[/URL] | Mein Youtube PHP Kanal: [url]https://www.youtube.com/c/VitalijMik[/url]

          Kommentar


          • #6
            Er möchte, dass bei Syntax-Fehlern etc. kein Fatal Error die gesamte Srkiptausführung lahm legt.

            Kommentar


            • #7
              Zitat von monolith Beitrag anzeigen
              Er möchte, dass bei Syntax-Fehlern etc. kein Fatal Error die gesamte Srkiptausführung lahm legt.
              dann sollte man keine Syntax fehler machen
              apt-get install npm -> npm install -g bower -> bower install <package> YOLO [URL]https://www.paypal.me/BlackScorp[/URL] | Mein Youtube PHP Kanal: [url]https://www.youtube.com/c/VitalijMik[/url]

              Kommentar


              • #8
                Er möchte aber ein Template, dass er durch seine Template-Engine jagt und in ausführbaren PHP-Code umwandelt, ausführen.

                Kommentar


                • #9
                  Hallöchen,
                  Zitat von monolith Beitrag anzeigen
                  Er möchte aber ein Template, dass er durch seine Template-Engine jagt und in ausführbaren PHP-Code umwandelt, ausführen.
                  ein Grund mehr sich eine Template-Engine wie Twig anzusehen.

                  Viele Grüße,
                  lotti
                  [SIZE="1"]Atwood's Law: any application that can be written in JavaScript, will eventually be written in JavaScript.[/SIZE]

                  Kommentar


                  • #10
                    Zitat von monolith Beitrag anzeigen
                    Er möchte aber ein Template, dass er durch seine Template-Engine jagt und in ausführbaren PHP-Code umwandelt, ausführen.
                    PHP-Code:
                    <?php

                    class __Mustache_5e3a9d5e78a660be984a52e66808ee60 extends Mustache_Template
                    {
                        private 
                    $lambdaHelper;

                        public function 
                    renderInternal(Mustache_Context $context$indent '')
                        {
                            
                    $this->lambdaHelper = new Mustache_LambdaHelper($this->mustache$context);
                            
                    $buffer '';

                            if (
                    $partial $this->mustache->loadPartial('header')) {
                                
                    $buffer .= $partial->renderInternal($context$indent '');
                            }
                            if (
                    $partial $this->mustache->loadPartial('logo')) {
                                
                    $buffer .= $partial->renderInternal($context$indent '');
                            }
                            
                    $buffer .= $indent '<div class="container">
                    '
                    ;
                            
                    $buffer .= $indent '    <div class="panel panel-default">
                    '
                    ;
                            
                    $buffer .= $indent '        <div class="panel-body">
                    '
                    ;
                            
                    $buffer .= $indent '           
                    '
                    ;
                            
                    // 'failed' section
                            
                    $value $context->find('failed');
                            
                    $buffer .= $this->section999e0591374e98793dd23eeace3ddafd($context$indent$value);
                            
                    $buffer .= $indent '              
                    '
                    ;
                            
                    $buffer .= $indent '            <div class="row">
                    '
                    ;
                            
                    $buffer .= $indent '                <div class="col-md-8">
                    '
                    ;
                            
                    $buffer .= $indent '                    <a href="account/create" class="btn btn-info btn-large col-md-12">Create new account</a>
                    '
                    ;
                            
                    $buffer .= $indent '                  
                    '
                    ;
                            
                    $buffer .= $indent '                   
                    '
                    ;
                            
                    $buffer .= $indent '                </div>
                    '
                    ;
                            
                    $buffer .= $indent '                <div class="col-md-4">
                    '
                    ;
                            if (
                    $partial $this->mustache->loadPartial('pages/login')) {
                                
                    $buffer .= $partial->renderInternal($context$indent '                    ');
                            }
                            
                    $buffer .= $indent '                </div>
                    '
                    ;
                            
                    $buffer .= $indent '            </div>
                    '
                    ;
                            
                    $buffer .= $indent '
                    '
                    ;
                            
                    $buffer .= $indent '        </div>
                    '
                    ;
                            
                    $buffer .= $indent '    </div>
                    '
                    ;
                            
                    $buffer .= $indent '</div>
                    '
                    ;
                            if (
                    $partial $this->mustache->loadPartial('footer')) {
                                
                    $buffer .= $partial->renderInternal($context$indent '');
                            }
                            
                    $buffer .= $indent '
                    '
                    ;
                            
                    $buffer .= $indent '
                    '
                    ;

                            return 
                    $buffer;
                        }

                        private function 
                    section999e0591374e98793dd23eeace3ddafd(Mustache_Context $context$indent$value)
                        {
                            
                    $buffer '';
                            if (!
                    is_string($value) && is_callable($value)) {
                                
                    $source '
                                        <div class="alert alert-danger">
                                            <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button>
                                            <p>Invalid login</p>
                                        </div>
                                        '
                    ;
                                
                    $result call_user_func($value$source$this->lambdaHelper);
                                if (
                    strpos($result'{{') === false) {
                                    
                    $buffer .= $result;
                                } else {
                                    
                    $buffer .= $this->mustache
                                        
                    ->loadLambda((string) $result)
                                        ->
                    renderInternal($context);
                                }
                            } elseif (!empty(
                    $value)) {
                                
                    $values $this->isIterable($value) ? $value : array($value);
                                foreach (
                    $values as $value) {
                                    
                    $context->push($value);
                                    
                    $buffer .= $indent '                    <div class="alert alert-danger">
                    '
                    ;
                                    
                    $buffer .= $indent '                        <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button>
                    '
                    ;
                                    
                    $buffer .= $indent '                        <p>Invalid login</p>
                    '
                    ;
                                    
                    $buffer .= $indent '                    </div>
                    '
                    ;
                                    
                    $context->pop();
                                }
                            }
                        
                            return 
                    $buffer;
                        }
                    }
                    ein auszug aus der cache datei von Mustache
                    apt-get install npm -> npm install -g bower -> bower install <package> YOLO [URL]https://www.paypal.me/BlackScorp[/URL] | Mein Youtube PHP Kanal: [url]https://www.youtube.com/c/VitalijMik[/url]

                    Kommentar


                    • #11
                      Also schlägst du damit Mustache als Template-Engine vor?

                      Kommentar


                      • #12
                        Zitat von monolith Beitrag anzeigen
                        Also schlägst du damit Mustache als Template-Engine vor?
                        irgendwas, hauptsache nichts eigenes ich haette nicht mal die Lust/Nerven und Zeit eine eigene Template engine zu entwickeln. Mustache finde ich aktuell einfacher zu benutzen und auserdem gibt es mehrere Abwandlungen von in anderen Sprachen, so kann man das gleiche layout zb in Handelbars.js benutzen (wenn man zb eine Node.js anwendung schreiben will)

                        oder fue android oder objective-c usw http://mustache.github.io/

                        twig hat aber auch dinge wie vererbung, die hat mustache nicht :/
                        apt-get install npm -> npm install -g bower -> bower install <package> YOLO [URL]https://www.paypal.me/BlackScorp[/URL] | Mein Youtube PHP Kanal: [url]https://www.youtube.com/c/VitalijMik[/url]

                        Kommentar


                        • #13
                          Ich glaube kaum, dass es ihm in erster Linie um Ausgabetemplating geht, sonst bräuchte er ja kein eval. TE auf diesem Ausführungslevel werden letzten Endes auch irgendwann eval benutzen müssen.
                          Denn das Replacement soll ja zur Laufzeit geschehen, und, viele werden wieder sagen "uagh", es geht (immer noch) um Hausautomation und damit um möglichst kurze Latenzen ...
                          Laufzeitgedöhns ist halt Schwachsinn und eval jetzt auch nicht gerade ein Rennpferd. "Render" ein Include nach einer Konfigurationsänderung und alle sind glücklich.
                          [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


                          • #14
                            Zitat von BlackScorp Beitrag anzeigen
                            wer windows als webserver umgebung nutzt, macht generell was falsch
                            Wo hast du denn den quatsch her ?

                            Bspw. Apache Lounge läuft auf Windows Servern, die machen jetzt genau was falsch ?

                            Zum Thema: Wenn du eine Template-Engine willst die wirklich "leicht" ist: http://platesphp.com/
                            [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

                            Kommentar


                            • #15
                              Zitat von tr0y Beitrag anzeigen
                              Wo hast du denn den quatsch her ?

                              Bspw. Apache Lounge läuft auf Windows Servern, die machen jetzt genau was falsch ?

                              Zum Thema: Wenn du eine Template-Engine willst die wirklich "leicht" ist: http://platesphp.com/
                              was auch immer Apache Lounge ist, windows kann man nutzen, ist aber worst parctise. Und hast du nicht selbst gesagt dass best practise bedeutet dass es von vielen gemacht wird, die mehrheit nutzt nunmal linux
                              apt-get install npm -> npm install -g bower -> bower install <package> YOLO [URL]https://www.paypal.me/BlackScorp[/URL] | Mein Youtube PHP Kanal: [url]https://www.youtube.com/c/VitalijMik[/url]

                              Kommentar

                              Lädt...
                              X