Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    <script type="text/php">

    ... qualcuno mi ha già dato del "pazzo" ... ma vorrei sapere voi, che non seguite il mio blog , cosa ne pensate

    Premessa
    In una recente discussione è riapparso il famigerato eval.
    Questa funzione è sempre vista male e, per quel che mi riguarda, non ha motivo di esistere se non dove è irreplicabile.
    Per irreplicabile intendo quelle situazioni dove altri linguaggi possono compilare sorgenti, mentre il PHP, che non è un linguaggio "compilabile", non può
    L'idea mi è venuta dopo aver letto la storia dello <script type="text/ruby"> ... e che diamine, lo fanno i rubynetti e non possiamo farlo noi? Ed ecco la mia proposta.

    Risultato finale
    Codice PHP:
    <?php require 'PHPScriptHandler.php'?>
    <html>
        <head>
            <title>Hello PHP World</title>
            <script type="text/php" author="andr3a">
                $hello = ucwords('hello php world');
                
                $o = new stdClass;
                $o->test = 'hello again';
            </script>
            <script type="text/javascript">
            onload = function(){
                alert($hello);   // Hello Php World
                alert($o.test); // hello again
            };
            </script>
        </head>
        <body>        
        </body>
    </html>
    Concept
    Tramite un semplice handler output, si crea uno strato intermedio tra il server ed il client.
    Questo strato di fatto è in tutto e per tutto PHP, ovvero ci si può schiaffare praticamente qualunque cosa ma non avrebbe senso, nello strato intermedio, utilizzare funzioni di echo, print, o qualunque altra mandi a sua volta in output qualcosa.

    Risultato
    Il risultato finale è quello di avere qualunque tipo di variabile compatibile con JSON, per l'occasione riscritta all'interno di un tag script type="text/javascript" e quindi disponibile per gli script JavaScript a seguire, come è facile evincere dall'esempio mostrato.
    Per ottenere il tutto avevo inizialmente usato, quasi per gioco, una preg_replace_callback, ma poi mi sono reso conto che nel codice PHP stesso potrebbero esserci chiusure di tag </script> o altro.
    Questo non è possibile nemmeno col JavaScript, nel senso che se si apre uno script non si può mettere al suo interno un </script>, poichè il parser del browser darebbe errore.
    Essendo però in PHP, non vedo perchè simulare anche questo comportamento invece di sfruttare banalmente le funzioni di DOM disponibili in PHP5, l'unico che ha ragione di esistere oggi.

    Questo è un altro esempio di cosa si intende per strato intermedio tra server e client:
    Codice PHP:
    <?php require 'PHPScriptHandler.php'?>
    <html>
        <head>
            <title>Hello PHP World</title>
            <script type="text/php" author="andr3a">
            
                // qui siamo nel mezzo tra server e output, ergo il client
                $hello = ucwords('hello php world');
                
                // facciamo finta di voler passare anche
                // la variabile definita altrove nella parte server
                global $something;
                
                // possiamo anche includere scripts o altro ... ma non in questo esempio
            </script>
            <script type="text/javascript">
            onload = function(){
                // qui siamo sul client, a body caricato
                alert($hello);
                alert($something);
            };
            </script>
        </head>
        <body>
            <?php
                
    // qui siamo sul server
                
    $something '<div>Hello Body</div>';
                echo    
    $something;
            
    ?>
        </body>
    </html>
    Allora, cosa ne pensate?

    [edit]
    ooops .. la classe
    e per concludere, questo sistema non rischia javascript o code injection per il semplice motivo che il tutto è fatto sul server, e niente è possibile da client.
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  2. #2

    Re: <script type="text/php">

    Originariamente inviato da andr3a
    Allora, cosa ne pensate?
    Come direbbe Spolsky, è un'astrazione che fa acqua.

    Guardando un codice del genere ci si potrebbe aspettare che uno script scritto in un tag <script type="text/php"> inserito dopo a <script type="text/javascript">...</script> possa accedere a dei valori manipolati da Javascript ma ovviamente questo non puo' avvenire a meno di implementare un code behind stile ASP.NET.

  3. #3
    non c'è astrazione ... è solo un layer intermedio.

    Il layer è one way, qualunque variabile php presente in quel layer, te la ritroverai bella e pronta in javascript.

    ASP.NET non ha magie di questo tipo ... o almeno non mi risulta ... nel senso che usi si lo script, ma col runat server non è che hai il C# nel JS ... e per fortuna

    Il runat both invece è un altro paio di maniche, ma li c'è un'api apposita da seguire, non c'è il linguaggio vero e proprio.

    In pratica la maggiore utilità è evitare il classico caso dove vai a sporcare con tags php "apri e chiudi" tutte le variabili JavaScript che vorresti creare, popolare o passare tramite PHP prima che la pagina sia inviata.

    Per questo scopo mi sembra eccellente, ed è per questo che l'ho pensato ... quindi, come semplificazione, come layer intermedio e non come astrazione che non ha niente a che fare con la poposta, cosa ne pensate?


    [edit]
    un altro esempio va ...
    un esempio va ... meglio di tante parole ...
    codice:
    <script>
    $user = "<?php echo ucfirst($user); ?>";
    </script>
    contro
    codice:
    <script type="text/php">
    $user = ucfirst($user);
    </script>
    con l'aggiunta di non doversi preoccupare di slashes o altro e la possibilità di passare interi oggetti, array, stringhe, o quello che è ...
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  4. #4
    ultimo esempio ... perchè se si capisce la logica non si può cadere nel dubbio di filippo ...
    Codice PHP:
    <?php require 'PHPScriptHandler.php'?>
    <html>
        <head>
            <title>Hello PHP World</title>
            <script type="text/php" author="andr3a">
                function beforeClient(){}
                if(function_exists('fromServer'))
                    $message = 'Hello PHP';
            </script>
            <script type="text/javascript">
            alert($message);
            </script>
        </head>
        <body>
            <?php
                
    function fromServer(){}
                if(
    function_exists('beforeClient'))
                    echo 
    '

    something wrong</p>'
    ;
            
    ?>
        </body>
    </html>
    ovviamente se lo script javascript fosse prima, message sarebbe undefined

    Ma per me non fa una piega, dato che php non può essere usato sul client e dato che questo è appunto un layer tra elaborazione server e client ... non avrebbe quindi senso poter usare il javascript sul server, in questo modo, come non è possibile farlo con type="text/ruby" o text/python che sia ... o mi sono perso qualcosa?
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  5. #5
    Utente di HTML.it L'avatar di dottwatson
    Registrato dal
    Feb 2007
    Messaggi
    3,012
    Originariamente inviato da andr3a
    ultimo esempio ... perchè se si capisce la logica non si può cadere nel dubbio di filippo ...
    Codice PHP:
    <?php require 'PHPScriptHandler.php'?>
    <html>
        <head>
            <title>Hello PHP World</title>
            <script type="text/php" author="andr3a">
                function beforeClient(){}
                if(function_exists('fromServer'))
                    $message = 'Hello PHP';
            </script>
            <script type="text/javascript">
            alert($message);
            </script>
        </head>
        <body>
            <?php
                
    function fromServer(){}
                if(
    function_exists('beforeClient'))
                    echo 
    '

    something wrong</p>'
    ;
            
    ?>
        </body>
    </html>
    ovviamente se lo script javascript fosse prima, message sarebbe undefined

    Ma per me non fa una piega, dato che php non può essere usato sul client e dato che questo è appunto un layer tra elaborazione server e client ... non avrebbe quindi senso poter usare il javascript sul server, in questo modo, come non è possibile farlo con type="text/ruby" o text/python che sia ... o mi sono perso qualcosa?
    ti stanno proprio così antipatici i tag del php?

    una domanda, ma questo strato intermedio quante e quali risorse impegna? rallentamenti di elaborazione?
    Non sempre essere l'ultimo è un male... almeno non devi guardarti le spalle

    il mio profilo su PHPClasses e il mio blog laboweb

  6. #6
    Originariamente inviato da dottwatson
    ti stanno proprio così antipatici i tag del php?
    mi resta scomodo preoccuparmi di slashes, apostrofi, double quotes, apri e chiudi, uso di json_encode in ogni dove, per popolare variabili JavaScript quando necessario, ed in questo modo mi sembra si abbia una pulizia senza eguali.

    In questo modo infatti c'è uno spazio apposito dove è possibile dichiarare tutte le variabili per JavaScript e senza alcuno sforzo ma anzi in modo naturale, essendo il layer più prossimo al client e potendo in esso dichiarare variabili per il client.



    Originariamente inviato da dottwatson
    una domanda, ma questo strato intermedio quante e quali risorse impegna? rallentamenti di elaborazione?
    non ci sono rallentamenti di elaborazione, a meno che non sposti tutto il php dentro quel tag (ma eval è communque rapidissimo)

    Questo sistema non vuole, non può, e non deve soppiantare il modo solito di scrivere PHP, aggiunge solo un layer intermedio capace di comunicare informazioni al client.

    E' questo l'unico scopo, per ora
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.