Newsgroup: it.comp.www.php
Titolo: variabili e scope

Sto creando una semplice interfaccia per lavorare sulla rubrica in ldap.
Non me ne intendo molto di php ma questa cosa mi sembra veramente 
stupida e mi sta facendo impazzire.
In breve non riesco a prendere il valore delle variabili settate, sia 
includendole da un file esterno che nello stesso file.
La situazione è di questo tipo:
$a = 'Joe';
function f1() {
	echo $a;
}
function main() {
	f1();
}
Semplificando parecchio questa è la struttura, ora c'è qualche ragione 
sensata per cui non dovrebbe funzionare??
Oppure c'è un errore da qualche altra parte (se la risposta è sì incollo 
tutto che comunque son poche righe).

 ragione sensata per cui non dovrebbe funzionare?? 
Certo, si chiama "variables scope":
http://www.php.net/manual/it/language.variables.scope.php
Per fare quello che chiedi (sconsigliato) devi utilizzare
http://www.php.net/global
$a = 'Joe';
function f1() {
  global $a;
  echo $a;
}
function main() {
  f1();
}
Anche se sarebbe molto meglio passare la variabile come parametro in
modo da evitare l'utilizzo di variabili locali.
-- 
Vuoi distribuire il tuo sito web su CD/DVD?
Prova 
http://www.dwebpro.com/
Vuoi diventare un esperto analista PHP/MySQL?
Vieni a fare uno stage con noi: 
http://www.creativepark.it/stage/


Accidenti a me, ho letto la doc ma mi pareva di aver capito che 
dichiarandola prima della funziona fosse già nello scope globale.
Passerei anche come parametro ma mi vengono delle liste chilometriche!

 
Ecco ma tornando a bomba, e se invece volessi importarli da un altro 
file quindi?
include 'vars.php';
e passarli alle funzioni o dichiararli globali in esse? sigh :(

 }
$a = 'Joe';
function f1($string) {
         echo $string;
}
f1($a);

Mirko ha scritto:

Sě ma vorrei evitare di passare 2000 parametri ogni volta, mi conviene 
forse usare $GLOBALS a questo punto, che dite?

 Passerei anche come parametro ma mi vengono delle liste chilometriche!
Puoi usare un array per affrontare quel problema. Dai una occhiata alle
funzioni di WordPress per capire come gestisce un numero variabile di
parametri tramite array.


 e passarli alle funzioni o dichiararli globali in esse? sigh :(
Dipende dalla scope in cui includi il file. Se l'inclusione avviene a
livello "globale" (es. non all'interno di una funzione), puoi usare
global o passarle come parametri (come nell'esempio precedente).
Se descrivi con maggiori dettagli quello che stai realizzando e'
probabile che esistano soluzioni migliori di cui forse non hai tenuto
conto.


 
Ci stavo pensando, grazie

 
Sì userò global probabilmente, comunque spiego il problema...
Il mio programma php deve lavorare con entry ldap, vorrei avere una 
vista "sommario" e una "dettagliata", per adesso ho pensato la cosa in 
questo modo, l'utente si logga e gli viene mostrata tutta la rubrica.
Una voce in rubrica può essere una azienda o una persona 
(inetOrgPerson), a seconda di cosa è mostro alcuni attributi.
Cliccando su una voce entra nel dettaglio e può direttamente modificare 
gli attributi.
Ora per adesso ho scritto queste semplici funzioni:
<?php
	include 'vars.php';
	// TODO creare mappatura semplificante
	function connect() {
		//connetto al server ldap
		$ds = ldap_connect("localhost") or die("non riesco a connettermi");
		// echo "risultato connessione " . $ds . "<br />";
		ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);
		return $ds;
	}
	function bind($ds) {
		if ($ds) {
			echo "Binding ...";
			$r = ldap_bind($ds);
		}
		return $r;
	}
	//usare ldap_list invece di search, one level
	function search($ds,$filter,$base,$attrs) {
		echo "cerco in ". $base;
		$res = ldap_search($ds,$base,$filter);
		$record = ldap_get_entries($ds,$res);
		return $record;		
	}
	function disconnect($r) {
		ldap_unbind($r);
	}
 
	function outDitta($nome) {
		global $oAttrs,$base,$mapAttr;
		echo $base;
		$ds = connect();
		$r = bind($ds);
		$filtro = "(&(piacere=organization)(o=*))";
		$entries = search($ds,$filtro,$base,$oAttrs);
		// echo "ho trovato" . $entries["count"] . " risultati";
		for ($i = 0; $i < $entries["count"]; $i++) {
			echo "<table>\n";
			echo "<th><tr>" . $nome . "</tr></th>";
			foreach ($oAttrs as $attr) {
				echo "<tr>";
				echo "<td>" . $mapAttr[$attr] . "</td>";
				echo "<td>" . $entries[$attr] . "</td>";
				echo "</tr>";
			}
			echo "</table>";
		}
		disconnect($ds);
	}
?>
Ho ad esempio la variable $base che devo usare un po' ad ogni ricerca, 
per cui vorrei evitare di portarmela sempre appresso...
Tra l'altro adesso nonostante i parametri siano giusti ottengo questo 
errore:
Warning: ldap_search() [function.ldap-search]: Search: No such object in 
/var/www/rubrica/functions.php on line 21
E' possibile che $ds (il link identifier restituito da connect()) venga 
in qualche modo modificato tra i vari passaggi?

 per cui vorrei evitare di portarmela sempre appresso...
La puoi incapsulare come proprietà di una classe, che esporrà come
metodi le funzioni che hai già scritto. Dall'interno di tutte le
funzioni la potrai sempre accedere, una volta che hai istanziato un
oggetto.
bye!

 bye!
Consiglio astuto, chissą perché mi ero dimenticato che php ha anche gli 
oggetti :d, grazie