Newsgroup: it.comp.www.php
Titolo: controllare che il parametro, passato ad una funzione, sia una classe

C'è un modo per fare in modo che il parametro "$a", passato alla 
funzione "x", sia solo e soltanto un'istanza della classe "ccc"?
Ho provato in questo modo:
 
<?php
x(new ccc());  //accettato
x('abc');      //non accettato
x(123);        //non accettato
 
function x($a){
	if (gettype($a) != 'ccc'){
		echo 'parametro non accettato';
		exit;
	}
}
 
class ccc{}
?>
 
ma non funziona.
Infatti anche quando viene passato "new ccc()", la funzione gettype($a) 
restituisce semplicemente il tipo 'object', che purtroppo si riferisce 
ad un "oggetto generico" (non alla classe "ccc")...
Avete quindi capito cosa voglio fare?

 funzione "x", sia solo e soltanto un'istanza della classe "ccc"?
 
http://php.net/manual/en/function.get-class.php
 

 
http://php.net/manual/en/function.get-class.php
 
 
grazie

 function x($a){
 
function x(ccc $a) {
 
 
Cerca type hinting sul manuale.
 
Bye.
 


 
ottimo!!!
 

 C'č un modo per fare in modo che il parametro "$a", passato alla

Io ho sempre usato un if del tipo
 
if (!($x instanceof miaclasse)) die ("x non č istanza di miaclasse")
 
ma puoi benissimo usare il type hinting che č anche piů bello e conciso.

 ma puoi benissimo usare il type hinting che č anche piů bello e conciso.
 
infatti!

 ma puoi benissimo usare il type hinting che è anche più bello e conciso.
 
Per completezza diciamo che il type hinting e instanceof accettano anche 
i figli della classe specificata, quindi se hai
 
function x(a $a) { ... }
 
class a {}
class b extends a {}
 
x(new b());
 
funziona, perche` b e` figlio di a.
 
Con
 
if (get_class($a) == 'a')
 
verifichi che sia ESATTAMENTE di tipo a, quindi x(new b()) ti darebbe 
errore.
 
Bye.
 

 funziona, perche` b e` figlio di a.
 
giusto.
Ma se si volesse richiedere non una singola istanza di 'a', ma un array 
di istanze?
 
Ho provato
function x(array a $a) { ... }
ma non va...

 di istanze?
 
Non puoi. Devi controllare a mano uno per uno gli elementi dell'array.
 
In PHP gli array non sono semplici array, ma hash table che possono 
contenere qualsiasi cosa, perche` e` un linguaggio dinamico.
 
Bye.
 

 contenere qualsiasi cosa, perche` e` un linguaggio dinamico.
 
ok!!!
Ma come tipo si deve specificare per forza una classe?
Se volessi specificare String o Integer?
 
function y(string $a){}
function y(integer $a){}
 
... forse come al solito sto chiedendo troppo, devo quindi fare il 
controllo manualmente?

 function y(integer $a){}
 
Non puoi perche` in PHP il type hinting non funziona coi tipi base.
 
O wrappi (per Array c'è già la classe nella SPL, ma è abbastanza 
limitata) array e stringhe in classi apposite, o non puoi usare il 
typehint.
 
Ma ripeto: chiediti se non stai sbagliando approccio, con un linguaggio 
dinamico.
 
Bye.
 

 Non puoi perche` in PHP il type hinting non funziona coi tipi base.
 
ok, mi bastava sapere questo!


ciusto. Poi c'è anche da dire che da alcuni post sul sito di php alla 
voce type hinting, sembra che sia più lento di altri metodi, anche se 
non viene citato per comparazione il metodo instanceof.