Newsgroup: it.comp.www.php
Titolo: una cosa strana.. (Call to undefined function)

ciao,
uso php 4.0.6 su w98, con apache 1.3.20
so che in php 4 una funzione puo' essere chiamata anche prima di essere
definita, nello script, giusto?
-------- (dal manuale)
In PHP 3, functions must be defined before they are referenced. No such
requirement exists in PHP 4
--------
allora perche' questo:
--------
   (...)
15 $a=sss($filez);
16 function sss ($filez) {
     (...)
   }
   (...)
--------
mi provoca un errore del genere?
--------
Fatal error: Call to undefined function: sss() in c:\programmi\apache
group\apache\htdocs\html\fileman2.php on line 15
--------
oltretutto sono pressoche' sicuro che fino a qualche giorno fa non ci
fossero problemi del genere.. cosa puo' essere cambiato? chi mi sa aiutare?

Credo che in questo caso il concetto non sia esattamente quello che noi
pensiamo.
Il fatto č che se, per esempio, tu volessi chiamare una funzione presente in
un file incluso,
tale funzione dovrebbe comunque essere definita nel file primario che
include l'altro altrimenti potresti avere degli errori (il file da includere
manca...)
Eliminando tale richiesta con PHP4 , il manuale vuole dire:
tu puoi anche chiamare una funzione che non č stata definita.(perchč viene
definita in runtime se il file viene incluso/requirato).
Questo non vuol dire fisicamente nel testo del file php.
Per "before" si potrebbe intendere anche in tempo di runtime.
Morale:
secondo.php
-------------
function pippo($ugo){
    echo($ugo);
    }
primo.php
----------
require("secondo.php");
pippo("ciao);
PHP3 questo tipo di cosa non ti permetterebbe di farlo.
In effetti Php3 aveva la limitazione (seppur mai documentata credo) di non
poter chiamare funzioni definite in file inclusi
PHP4 invece sě.
Ciao
J
Suppongo sia questa la differenza.

 un file incluso,
l'errore lo ottengo comunque, anche se la funzione e' definita nello stesso
file, senza inclusioni:
ho fatto un po' di prove, e ho scoperto che dipende dal ** nome della
variabile sotto !isset() **
prova a fare un file come questo:
==========
<?
 if (!isset($file)) {
 } else {
  $a=sss();
  function sss() {
  }
 }
?>
==========
e ti da l'errore.
la variabile sotto !isset() ha lo stesso nome della funzione di filesystem
"file", forse e' quello il problema?  cambiando il nome l'errore scompare.
anche passando da !isset($file) a isset($file) l'errore scompare.
utilizzando qualunque altro nome per la variabile sotto !isset() l'errore
scompare, anche usando come nome di variabile un'altro nome di funzione, o
una parola riservata (che dovrebbe essere comunque legale, visto il $
davanti).
baco?
Marco


il tuo esempio e' legale.
Forse il problema e' quello:
Non dovresti definire una funzione all'interno di un blocco (all'interno di
un {}) e usarlo fuori. Detto in vulgaris: solo nel suo livello.
<?
    if (!isset($file)) {
    }
    else {
        $a=sss();
    }
    function sss() {
    }
?>
Seguente esempio e' illegale (xke' la funzione sss() viene anche chiamata al
di fuori dal blocco della sua dichiarazione.
<?
    if (!isset($file)) {
    } else {
        $a=sss();
        function sss() {
        }
    }
    sss(); // fatal
?>

ho capito i tuoi esempi, ma non ho capito secondo te da cosa deriva l'errore
nel mio script..
potresti rispiegarmelo?

 wrote in message news:9unrhs$5kt$1...@serv1.iunet.it...

Non ho idea cosa potrebbe essere, sembra che sia una versione kaputt. Se
dici che prima ti funzionava proverei a reinstallare il php.
Oppure hai modificato il php.ini, con qualche parametro strano?

anche passando da !isset($file) a isset($file) l'errore scompare.
Certamente. Perche' NON VIENE PIU' ESEGUITO L'IF. Stai testando una nuova
variabile, che NON ESISTE. E siccome il codice bacato viene eseguito solo
se la variabile ESISTE, dandogli una variabile inesistente tutto va bene.
Altresi' va bene se gli dai una variabile che esiste, ma INVERTI il test.
Leonardo
-- 
And where the black and corkscrew towers climb
Lost and athirst the ragged pack abides,
Old as the aeons, trapped in tombs of time,
Sailing the tortuous temporal tides...

no, probabilmente e' un errore concettuale. non e' possibile chiamare una
funzione definita condizionalmente PRIMA che sia definita. grazie, comunque.


 Altresi' va bene se gli dai una variabile che esiste, ma INVERTI il test.
si, ok, ora lo capisco, accettando la tesi (e' una tesi o sei sicuro?) del
differente comportamento di php4 riguardo la "dichiarazione condizionale"..
prima mi sembrava assurdo.. grazie.
Marco

si, ok, ora lo capisco, accettando la tesi (e' una tesi o sei sicuro?)
Ho fatto delle prove. La sicurezza granitica e' una cosa che non ho mai, ma
in questo caso mi sento abbastanza roccioso :-)



Attenzione che qui bisogna mettere le {} (vedi anche manuale
www.php.net/function.include
 :
Because include() is a special language construct, you must enclose it
within a statement block if it is inside a conditional block.)
if ($a==1){
  include "tuafunz.php";
}
Se non metti le {} e definisci magari due funzioni la prima sara' definita
nel blocco implicito del
if ($a==1) e la seconda al di fuori, creando un po' di confusione...

Attenzione che qui bisogna mettere le {} (vedi anche manuale
WHOA, e' vero! :-(
Leonardo in ginocchio sui ceci
