Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Aug 2003
    Messaggi
    94

    undefined function ma la function esiste

    ho creato questa pagina test.php :

    codice:
    <?php
    
    class miaClasseName
    {
    	//Globale
    	var $gBreak = "
    ";
    	var $gBreakToChange = "\n";
    
    	var $titolo_ordine = array('primo', 'secondo', 'terzo', 'quarto', 'quinto');
    
    	var $titolo_array_titoli = array(
    		array('juve', 'milan', 'inter', 'napoli', 'udinese'),
    		array('rosso', 'bianco', 'nero', 'verde', 'azzurro'),
    		array('real', 'barca', 'dinamo', 'bayern', 'stella')
    	);
    
    	var $titolo_num = 3;
    	var $titolo_num_volte = 6;
    
    
        function functionUno(){
            return functionTipo('titolo uno', 0);
        }
    
        function functionDue(){
            return functionTipo('titolo Due', 1);
        }
    
        function functionTre(){
            return functionTipo('titolo Tre', 2);
        }
    
    
        function functionTipo($titolo, $idxtitolo){
    		$titolo_tmp = '';
    		$titolo_tmp .= getIntroduzione().''.aCapo(2);
    
    		for($i=0; $i<$titolo_num; $i++) {
    			$titolo_tmp .= getAnnunciotitolo(i,$titolo,$titolo_array_titoli[$idxtitolo][i]).''.aCapo(2);
    
    			for($j=0;$j<$titolo_num_volte;$j++) {
    				$titolo_tmp .= getTantiMsg().''.aCapo(2);
    			}
    		}
    
    		$titolo_tmp .= functionFine().''.aCapo(2);
    
            return $titolo_tmp;
        }
    
    
    	function getAnnunciotitolo($numtitolo,$titolo,$titletitolo){
    		return 'Ciao '.$titolo_ordine[$numtitolo].' '.$titolo.' si sono '.$titletitolo.'»';
        }
    
    
    	function getIntroduzione(){
    		return '«mio testo Introduzione»';
        }
    
    	function getTantiMsg(){
    		$temp = 'Mio Titolo\n\n';
    
    		$temp .= 'la vita è bella.';
    
    		return $temp;
        }
    
    	function functionFine(){
    		$temp = 'Titolo Fine\n\n';
    
    		$temp .= 'Alla fine della strada.';
    
    		return $temp;
        }
    
    
    	function aCapo($num){
    		$tmp = $gBreak;
    		for($i=0; $i<$num; $i++) {
    			$tmp .= $gBreak;
    		}
    		return $tmp;
        }
    
        function getFunctionName( $params ){
    		$giorno  = 1;
    
    		$tmp = '';
    
    		$tmp = functionUno();
    
    /*
    		switch($giorno) {
    			case 1:$tmp .= functionUno();break;
    			case 2:$tmp .= functionDue();break;
    			case 3:$tmp .= functionTre();break;
    		}
    */
            return $tmp;
        }
    
    }
    
    $titolo = miaClasseName::getFunctionName( $params );
    //$titolo = miaClasseName::functionUno();
    
    echo $titolo;
    
    ?>

    Quando la chiamo ottengo questo errore:

    Fatal error: Call to undefined function functionUno() in C:\xampp\htdocs\test\test.php on line 91

    Se invece di

    $titolo = miaClasseName::getFunctionName( $params );

    uso

    $titolo = miaClasseName::functionUno();

    lo stesso messaggio l'ho ottengo per la function functionTipo().

    Sembra che le function della classe non vede le function interne. Potete aiutarmi a capire l'errore?
    Grazie

  2. #2
    Moderatore di Windows e software L'avatar di URANIO
    Registrato dal
    Dec 1999
    residenza
    Casalpusterlengo (LO)
    Messaggi
    1,287
    Immagino tu stia usando PHP4 e non il 5 altrimenti dovrebbe(?non sono sicuro) darti errore.

    Stai chiamando i metodi della classe in modo statico.
    I metodi della classe richiamati in modo statico semplicemente non trovano le funzioni interne alla classe dato che non conoscono la classe, per richiamarle dovrebbero fare miaClasseName::nomefunzione().

    Non so cosa vuoi fare ma normalmente dovresti fare la new della classe e poi attraverso l'oggetto creato chiamare la funzione.

    tipo
    $oggeto = new miaClasseName();
    $titolo = $oggeto->functionUno();

    Per informazioni sulle chiamate statiche in php4 vedi qua
    http://theserverpages.com/php/manual...ekudotayim.php

  3. #3
    Il problema in realtà è qui:

    Codice PHP:
    ...
    function 
    functionUno(){
        return 
    functionTipo('titolo uno'0);
    }
    ... 
    dovresti modificare così:

    Codice PHP:
    ...
    function 
    functionUno(){
        return 
    miaClasseName::functionTipo('titolo uno'0);
    }
    ... 
    e lo stesso per tuttel le funzioni interne invocate.
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

  4. #4
    Utente di HTML.it
    Registrato dal
    Aug 2003
    Messaggi
    94
    Intanto grazie ad entrambi.
    La versione di php5 che sto usando è la 5.2.5.

    La seconda soluzione ha risolto il problema.
    Provengo dalla programmazione Java e li i metodi interni basta chiamarli direttamente.

    Ho imparato una cosa nuova.

    Grazie mille
    Aki

  5. #5
    Moderatore di Windows e software L'avatar di URANIO
    Registrato dal
    Dec 1999
    residenza
    Casalpusterlengo (LO)
    Messaggi
    1,287
    Originariamente inviato da akinet
    Intanto grazie ad entrambi.
    La versione di php5 che sto usando è la 5.2.5.

    La seconda soluzione ha risolto il problema.
    Provengo dalla programmazione Java e li i metodi interni basta chiamarli direttamente.

    Ho imparato una cosa nuova.

    Grazie mille
    Aki
    Non conosco molto Java, ma mi pare che anche li dovresti dichiararle static per accederci senza creare l'oggetto.

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2010
    Messaggi
    570
    specifica sempre nel codice se un metodo è pubblic, private, protected, static e/o final

    sennò è un incubo leggere il tutto

  7. #7
    Utente di HTML.it
    Registrato dal
    Aug 2003
    Messaggi
    94
    Codice PHP:
            for($i=0$i<$titolo_num$i++) {
                
    $titolo_tmp .= getAnnunciotitolo(i,$titolo,$titolo_array_titoli[$idxtitolo][$i]).''.aCapo(2);

                for(
    $j=0;$j<$titolo_num_volte;$j++) {
                    
    $titolo_tmp .= getTantiMsg().''.aCapo(2);
                }
            } 
    a questo punto del codice non vengono riconosciute le variabili $titolo_num e $titolo_num_volte a quanto pare restituiscono 0 o null e non eseguono i cicli e la stessa cosa succede quando viene chiamata l'array :
    Codice PHP:
    $titolo_array_titoli[$idxtitolo][$i]) 
    Qualcuno puo' suggerirmi un buon tutorial sulle classi PHP...magari in italiano?

  8. #8
    Utente di HTML.it L'avatar di bstefano79
    Registrato dal
    Feb 2004
    Messaggi
    2,520
    dove hai messo questa parte di codice??? quelle non sono semplici variabili ma sono proprietà dell'oggeto di tipo miaClasseName


    P.S. i nomi delle classi vanno scritte in CamelCase con tutte le iniziali maiuscole, quindi la classe si dovrebbe chiamare MiaClasseName con la M maiuscola
    Questa è una convenzione quindi non avrai messaggi di errore se fai diversamente, ma è meglio imparare subito a usare le notazioni standard

  9. #9
    Utente di HTML.it
    Registrato dal
    Aug 2003
    Messaggi
    94
    Ho risistemato il codice:

    Codice PHP:
    <?php

    class MiaClasseName
    {
        
    //Globale
        
    const BREAK_LINE "
    "
    ;
        const 
    BREAK_LINE_TO_CHANGE "\n";

        var 
    $titolo_ordine = array('primo''secondo''terzo''quarto''quinto');

        var 
    $titolo_array_titoli = array(
            array(
    'juve''milan''inter''napoli''udinese'),
            array(
    'rosso''bianco''nero''verde''azzurro'),
            array(
    'real''barca''dinamo''bayern''stella')
        );

        const 
    TITOLO_NUM 3;
        const 
    TITOLO_NUM_VOLTE 3;


        private static function 
    functionUno(){
            return 
    MiaClasseName::functionTipo('titolo uno'0);
        }

        private static function 
    functionDue(){
            return 
    MiaClasseName::functionTipo('titolo Due'1);
        }

        private static function 
    functionTre(){
            return 
    MiaClasseName::functionTipo('titolo Tre'2);
        }


        private static function 
    functionTipo($titolo$idxTitolo){
            
    $titolo_tmp '';
            
    $titolo_tmp .= MiaClasseName::getIntroduzione().''.MiaClasseName::aCapo(2);
            
    $titolo_tmp .= '<hr />';

            for(
    $i=0$i<MiaClasseName::TITOLO_NUM$i++) {
                
    $titolo_tmp .= MiaClasseName::getAnnunciotitolo($i,$titolo,$titolo_array_titoli[$idxTitolo][$i]).''.MiaClasseName::aCapo(2);

                for(
    $j=0;$j<MiaClasseName::TITOLO_NUM_VOLTE;$j++) {
                    
    $titolo_tmp .= MiaClasseName::getTantiMsg().''.MiaClasseName::aCapo(2);
                }
                
    $titolo_tmp .= '<hr />';
            }

            
    $titolo_tmp .= MiaClasseName::functionFine().''.MiaClasseName::aCapo(2);

            return 
    $titolo_tmp;
        }


        private static function 
    getAnnunciotitolo($numtitolo,$titolo,$titleTitolo){
            return 
    'Ciao <'.$titolo_ordine[$numtitolo].'> <'.$titolo.'> si sono <'.$titleTitolo.'>';
        }


        private static function 
    getIntroduzione(){
            return 
    'Inizio della strada';
        }

        private static function 
    getTantiMsg(){
            
    $temp 'Mio Titolo\n\n';

            
    $temp .= 'la vita &egrave; bella.';

            return 
    $temp;
        }

        private static function 
    functionFine(){
            
    $temp 'Titolo Fine\n\n';

            
    $temp .= 'Alla fine della strada.';

            return 
    $temp;
        }


         private static function 
    aCapo($num){
            
    $tmp MiaClasseName::BREAK_LINE;
            for(
    $i=0$i<$num$i++) {
                
    $tmp .= MiaClasseName::BREAK_LINE;
            }
            return 
    $tmp;
        }

        public static function 
    getFunctionName$params ){
            
    $giorno  2;

            
    $tmp '';

            switch(
    $giorno) {
                case 
    1:$tmp .= MiaClasseName::functionUno();break;
                case 
    2:$tmp .= MiaClasseName::functionDue();break;
                case 
    3:$tmp .= MiaClasseName::functionTre();break;
            }

            return 
    str_replace('\n','
    '
    ,$tmp);
        }

    }

    $titolo MiaClasseName::getFunctionName$params );
    //$titolo = MiaClasseName::functionUno();

    echo $titolo;
    ?>

    il problema rimane nell'accedere negli array. Ho visto un centinaio di esempi e non c'è differenza con quello che ho scritto io, pero' non funziona

  10. #10
    Moderatore di Windows e software L'avatar di URANIO
    Registrato dal
    Dec 1999
    residenza
    Casalpusterlengo (LO)
    Messaggi
    1,287
    Se chiami il metodo in modo statico anche le variabili andranno chiamate in modo statico
    Al posto di $titolo usa self::$titolo

    Visto le tue domande, sei sicuro di voler fare la classe in questo modo?
    Perché non creare l'oggetto?(il tuo primo esempio avrebbe funzionato)

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.