Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 28
  1. #1

    define + class, un nonsenso assoluto?

    Il titolo dice tutto, il codice e' a mio avviso allucinante ... qualcuno mi spiega la logica?
    Codice PHP:
    define('pippo','1');
    class 
    pippo {
        public  function    
    __toString(){
            return  
    cfeed;
        }
    }
    exit(new 
    pippo); 
    grazie ...

    [edit]
    non spiegatemi cos'e' il metodo __toString ma come diavolo sia possibile un'ambiguita' di questo tipo tra una costante ed una classe che hanno lo stesso nome
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  2. #2
    Il define è inutile ed inutilizzato dal resto del codice.

    Semplicemente definisci una classe "pippo" e richiami il costrutto exit() passando come argomento una nuova istanza della classe "pippo". Poichè exit() prevede come parametro un int od una stringa, il metodo __toString() viene richiamato per convertire l'istanza di "pippo" in una stringa. Ed ecco che ottieni in output un "Notice: Use of undefined constant cfeed - assumed 'cfeed'" e cfeed;

  3. #3
    si ... bene, appunto ... non spiegatemi ovvieta', spiegatemi come sia possibile, in PHP 5.2.5 E_ALL | E_STRICT che posso definire una costante con lo stesso nome di una classe o definire una class e poi una costante con lo stesso nome ... e il tutto dopo aver testato il codice, che non mostra alcun notice, grazie


    poi gia' che ci siete spiegatemi anche perche' se dichiaro la __toString public static questa e' usata come se fosse un __toString

    P.S. filippo, grazie per lo sforzo ma so quanto hai detto da taaaaantoooo tempo ... e' ben altro quello che mi preoccupa e non ha senso


    [edit] ... azz, ho lasciato il nome originale della classe nel toString ... cambiatelo con pippo prima di ritestare (quindi si, cosi' il notice e' corretto)

    questo il codice che avevo postato e poi editato male
    Codice PHP:
    define('pippo','1');
    class 
    pippo {
        public  function    
    __toString(){
            return  
    pippo;
        }
    }
    exit(new 
    pippo); 
    l'exit puo' esser echo o quello che volete
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  4. #4
    Perchè non dovrebbe essere possibile?

    perche' se dichiaro la __toString public static questa e' usata come se fosse un __toString
    Perchè __toString è un metodo magico, non si comporta come un normale metodo. Ad esempio:

    Codice PHP:
    <?php 
    class pippo {
        private function 
    __toString(){
            return 
    "Hello World!";
        }
    }
    echo(new 
    pippo);
    $p = new pippo();
    $p->__toString();
    ?>

  5. #5
    guarda che quello e' un fatal error ... ok filippo, il problema e' la define, lascia perdere il __toString che e' un altro non senso vero, ma non il soggetto di questo post.

    danieeeeeeleeeeee
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  6. #6
    guarda che quello e' un fatal error ...
    E' un fatal error SOLO sulla chiamata $p->__toString();, NON echo(new pippo);

    Questo avviene perchè $p->__toString(); è un tentativo di chiamata ad un metodo privato, mentre tramite echo(new pippo); il metodo magico __toString() viene richiamato internamente da PHP e funziona come ci si aspetta. Ecco il motivo per cui, anche se lo definisci static, funziona nel costrutto echo(new pippo);

    Come da manuale "You cannot have functions with these names in any of your classes unless you want the magic functionality associated with them.".

    Perchè non dovrebbe essere possibile?
    Perchè ritieni un "non senso" poter definire una classe ed una costante con lo stesso identficatore?

  7. #7
    filippo, del toString non me ne importa niente ... è un nonsenso comunque ma per altri motivi e non è in topic ... basta, ti prego, conosco il toString da anni

    Originariamente inviato da filippo.toso
    Perchè ritieni un "non senso" poter definire una classe ed una costante con lo stesso identficatore?
    fallo con qualunque altro linguaggio ... e dimmi in quale puoi usare una costante come nome di una classe e/o viceversa ...
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  8. #8
    fallo con qualunque altro linguaggio ... e dimmi in quale puoi usare una costante come nome di una classe e/o viceversa ...
    Ci sono molte cose che in certi linguaggi si possono fare ed in altri no. Il solo fatto che non si possa fare in un altro linguaggio non dice molto.

    In PHP, un linguaggio scarsamente tipizzato, esistono pochi costrutti/operatori che lavorano con il "tipo" classe (es. new, instanceof) e nessuno di questi accetta un valore scalare al posto del "tipo" classe. Per questo motivo, anche potendo definire una costante con lo stesso identificatore di una classe (e viceversa), non vi sarà mai una situazione equivoca.

    Se sei sicuro che questa possibilità debba essere esclusa, apri un ticket sul sistema di bug tracking del PHP.

  9. #9
    Moderatore di Javascript L'avatar di ciro78
    Registrato dal
    Sep 2000
    residenza
    Napoli
    Messaggi
    8,514
    ciao andrea non capisco che errore ti viene visualizzato. sarà che ancora dormo
    da quanto ho capito il problema è utilizzare una costante che abbia lo stesso nome della classe

    io ho scritto il seguente codice e non mi restituisce errori

    Codice PHP:

    error_reporting
    (E_ALL);
    define('ciro',"Proprietario");
    class 
    ciro
        
    {
        public function 
    esempio ()
            {
            echo 
    ciro;
            }
        }
    $a= new ciro;
    $a->esempio() 
    Ciro Marotta - Programmatore JAVA - PHP
    Preferisco un fallimento alle mie condizioni che un successo alle condizioni altrui.


  10. #10
    allora, per tutti ... l'anomalia è questa (mannaggia a me e al toString)
    codice:
    define('pippo', 123);
    class pippo{
    }
    fine ... non capisco come sia possibile definire una costante ... ed usare lo stesso nome della costante per nominare una classe.

    Questo è assolutamente ambiguo, perchè se si pensa alla reflection, alle pubbliche statiche, alle funzioni di definizionetipo, eccetera, si capisce quanto sia ovvio che nessun altro linguaggio permetta un'ambiguità di questo tipo.

    cos'è pippo ... una costante o una classe? in uno switch voi cosa cerchereste di sapere, se è defined('pippo') o class_exists('pippo') ? .... chi viene prima e chi dopo ? Quale senso ha una sbavatura logica, per filippo a parte, di questo tipo?

    Poi magari sono io che non sono di larghe vedute, ma oltre ambiguità, non è che questa è una feature in più e vorrei sapere chi al mondo utilizza quotidianamente questa ambiguità.

    Anzi, uno che l'ha fato lo conosco, ecco perchè ho aperto il 3D ... è talmente furbo che infatti il codice era:
    codice:
    if(!class_exists('pippo')){
    define('pippo', '1');
    class pippo{
    }
    }
    perchè poi non usava poi il class_exists altrove ... no, ci piantava un bel if pippo == '1' sopprimendo i notice ... ma come diavolo si fa a programmare in questo modo?
    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.