Visualizzazione risultati 1 fino 20 di 20

Discussione: Cannot redeclare function

  1. #1
    Guest

    Predefinito Cannot redeclare function

    File.php
    Codice PHP:
    <?php
    function foo(){
    echo
    "bar";
    }
    ?>
    Index.php
    Codice PHP:
    <?php

    include"File.php";
    include
    "File.php";

    ?>
    Errore Cannot redeclare function foo()

    Bene lo so che può sembrare strano, ma c'è un modo da evitare tutto ciò?
    Il primo passo è stato quello di includere il file dentro una variabile, con ob_.

    Quindi l'intento è avere due variabili che includano il File.php senza andare in errore a causa della funzione dichiarata due volte.
    Può darsi ci riesca da solo a trovare una soluzione, ma chiedo aiuto ugualmente magari appassiona qualcuno.

  2. #2
    Guest

    Predefinito

    include_once()

  3. #3
    Guest

    Predefinito

    Eh beh no, guarda, chiarisco col codice:

    Codice PHP:
    <?php

    $filename
    = 'File.php';

    ob_start();
    include
    $filename;
    $content1 = ob_get_contents();
    ob_end_clean();

    ?>
    Codice PHP:
    <?php

    $filename
    = 'File.php';

    ob_start();
    include
    $filename;
    $content2 = ob_get_contents();
    ob_end_clean();

    ?>
    Codice PHP:
    <?php

    echo $content1;

    echo
    $content2;

    ?>
    Questo è il problema, voglio che ogni volta che venga processato un file php conservi solo l'output dentro la stringa e basta.
    Così da evitare il problema col cannot redeclare in caso di funzione.

  4. #4
    Guest

    Predefinito

    Scusa, ma se devi includere lo stesso file, non fai prima ad includerlo una volta e e valorizzare due variabili?
    Codice PHP:
    $content1 = $content2 = ob_get_contents();

  5. #5
    Guest

    Predefinito

    No, perché l'output cambia giustamente sennò uso la stessa variabile (ma non è quello che serve a me).

    Come già preannunciato è un problema che vorrei risolvere ma che va contro le regole di php.
    Si tratta d'includere lo stesso file in più variabili, ogni variabile avrà un output diverso ma generato sempre dallo stesso file.
    Chiaro che se è un file contenente funzioni o classi va in errore di cannot redeclare.

  6. #6
    L'avatar di AlexKidd
    AlexKidd non è connesso Altervistiano Junior
    Data registrazione
    09-02-2007
    Messaggi
    516

    Predefinito

    Secondo me hai due possibili soluzioni:

    1) esporti le definizioni delle funzioni in un altro file PHP

    oppure se è necessario che tali funzioni risiedano in quel file

    2) converti tutte le funzioni rendendole anonime in questo modo http://php.net/manual/en/function.create-function.php

  7. #7
    Guest

    Predefinito

    Provato con require invece? Scusami..ma perché dovresti includere 2 file (stessi,uguali) con lo stesso contenuto? O__o

  8. #8
    Guest

    Predefinito

    require è lo stesso di include, cambia solamente il messaggio di errore e al posto di generare un Warning, genera un Fatal Error interrompendo lo script, quindi non gli è utile

  9. #9
    Guest

    Predefinito

    Mmm, ci avevo pensato alla funzione anonima ma..
    La situazione si presenta col mio CMS, in breve vengono inclusi i plugin (semplici file php) con dei tag code es. {nomeplugin} ecco il problema nasce se questo plugin viene richiamato 2 o più volte.

    Ho pensato di leggere il file e fare una sorta di riscrittura delle funzioni e classi, però non so, mi sembra troppo macchinosa come soluzione.
    Qualche idea?

  10. #10
    L'avatar di AlexKidd
    AlexKidd non è connesso Altervistiano Junior
    Data registrazione
    09-02-2007
    Messaggi
    516

    Predefinito

    In linguaggi come il C/C++ questi problemi si risolvono isolando il codice che (ri)definisce delle funzioni/variabili/classi con dei define

    Potresti provare a far cosi anche in PHP, controlli se una costante è stata definita, se lo è salti la porzione di codice altrimenti definisci la costante ed esegui una sola volta il codice interessato

    Ovviamente anche in questa soluzione, come per le funzioni anonime, bisogna metter le mani dentro ai plugin e non ci si può limitare a manipolarli dall'esterno come se si potesse assegnare ad ogni esecuzione una sandbox

  11. #11
    Guest

    Predefinito

    Purtroppo io devo realizzare un sistema che sia del tutto "esterno", perché non puoi sviluppare i plugin per il mio cms secondo delle regole specifiche, altrimenti nessuno sviluppatore lo prenderà mai in considerazione.

    Io personalmente mi scoccerei a dover stare attento, cioè perdo la flessibilità che per me è un concetto base.

    Edit:
    Ho un'idea, se la funzione è già stata dichiarata passa avanti ed esegue il codice, come potrei fare?.
    Ultima modifica di svacant : 13-09-2009 alle ore 22.01.30

  12. #12
    Guest

    Predefinito

    Scusami, potresti fare un controllo e vedere se ci sono più {nomeplugin} e così lo richiami solo 1 volta! =)
    Ciauu! =D
    Edit: potresti fare una cosa del genere:
    Codice PHP:
    $file = file_get_contents("template.txt");

    $file = str_replace("{","",$file); $file = str_replace("}","",$file);

    $array = array($ricavoplugin);
    if(
    in_array($array,$file)) { include "1volta.php"; }
    E' sintassicamente scorretto, ma è per fartelo capire. XD
    Ultima modifica di sIM : 13-09-2009 alle ore 22.09.50

  13. #13
    Guest

    Predefinito

    Sì ma, se io ho un plugin che crea dei blocchi di adsense? è finita l'utilità del plugin se devo chiamarlo solo una volta.

    ps ci sto lavorando ho provato l'unset dell'array restituito da get_definide_functions() ma nulla.

    Edit
    http://it2.php.net/manual/en/book.runkit.php
    Ultima modifica di svacant : 13-09-2009 alle ore 22.34.42

  14. #14
    L'avatar di matt93
    matt93 non è connesso Utente
    Data registrazione
    01-09-2008
    Messaggi
    241

    Predefinito

    gestire il plugin con delle funzioni e delle classi?

    i file del plugin richiamerebbero le funzioni nella classe.

    Codice PHP:
    <?

    class Plugins{
    var
    $events=array();

    function
    addEventListener($evt,$f,$d='none'){
    if(!isset(
    $this->events[$evt])){
    $this->events[$evt]=array();
    }
    array_push($this->events[$evt],array($f,$d));
    }

    function
    newEvent($evt,$data='none'){
    if(isset(
    $this->events[$evt])){
    $e=$this->events[$evt];
    }else{
    $e=array();
    }
    foreach(
    $e as $event){
    call_user_func($event[0],$data,$event[1]);
    }
    }

    function
    loadPlugins(){
    if(
    is_array(glob(PATH."plugins/*/main.plugin.php"))){
    foreach(
    glob(PATH."plugins/*/main.plugin.php") as $file){
    include(
    $file);
    }
    }
    }
    }
    ?>
    il file del plugin:
    Codice PHP:
    <?
    $this
    ->numbers=0;
    function
    _plugin_prova_init($mcms_data,$func_data){
    global
    $_P;
    $_P->numbers++;
    echo
    "Volte:".$_P->numbers."<br/>";
    }

    $this->addEventListener('cms_start','_plugin_prova_init');
    $this->addEventListener('cms_start','_plugin_prova_init');
    $this->addEventListener('cms_start','_plugin_prova_init');
    $this->addEventListener('cms_start','_plugin_prova_init');
    $this->addEventListener('cms_start','_plugin_prova_init');
    $this->addEventListener('cms_start','_plugin_prova_init');
    $this->addEventListener('cms_start','_plugin_prova_init');
    $this->addEventListener('cms_start','_plugin_prova_init');
    $this->addEventListener('cms_start','_plugin_prova_init');
    $this->addEventListener('cms_start','_plugin_prova_init');

    // Tutte le volte che voglio xD
    all'inizio di ogni pagina:
    Codice PHP:
    <?
    $_P
    =new Plugins;
    $_P->loadPlugins();
    $_P->newEvent('cms_start');
    ?>
    questa è roba del mio CMS, quindi :P
    Ultima modifica di matt93 : 13-09-2009 alle ore 23.49.32

  15. #15
    Guest

    Predefinito

    Non l'ho capita, o forse non hai capito quello che cerco:S
    Io necessito di una cosa simile a runkit_import();

    Credo di aver risolto, semplicemente impartendo solo una regola nella creazione di un plugin, le funzioni e le classi dovranno stare in altri file (include_once), il file principale non dovrà contenere dichiarazioni di funzioni ma solo il richiamo alle funzioni.
    Ultima modifica di svacant : 14-09-2009 alle ore 00.18.43

  16. #16
    L'avatar di AlexKidd
    AlexKidd non è connesso Altervistiano Junior
    Data registrazione
    09-02-2007
    Messaggi
    516

    Predefinito

    Citazione Originalmente inviato da svacant Visualizza messaggio
    Credo di aver risolto, semplicemente impartendo solo una regola nella creazione di un plugin, le funzioni e le classi dovranno stare in altri file (include_once), il file principale non dovrà contenere dichiarazioni di funzioni ma solo il richiamo alle funzioni.

    Citazione Originalmente inviato da AlexKidd Visualizza messaggio

    1) esporti le definizioni delle funzioni in un altro file PHP
    emh

  17. #17
    Guest

    Predefinito

    Sono soluzioni che appesantirebbero il motore PHP, le performance sono importanti :D

  18. #18
    Guest

    Predefinito

    Ma dai...PHP è velocissimo con me!

  19. #19
    Guest

    Predefinito

    Non credo parli di performance a livello visibile così se non con qualche funzione come memory_get_usage()

  20. #20
    Guest

    Predefinito

    Citazione Originalmente inviato da svacant Visualizza messaggio
    Edit:
    Ho un'idea, se la funzione è già stata dichiarata passa avanti ed esegue il codice, come potrei fare?.
    function_exists()

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •