2011-01-06 7 views
20

È meglio spiegare con un esempio. Cerco una funzione "theFunctionILookFor" che farà funzionare il codice.PHP: instanceof equivalente per un nome di classe rappresentato da stringhe

$myClassName = "someName"; 
$parentOrInterfaceName = "someParent"; 
if (theFunctionILookFor ($myClassName)) echo "is parrent"; 

edit: Cerco di evitare di istanziare la classe solo per eseguire questo controllo. Vorrei essere in grado di passare 2 parametri di stringa alla funzione di controllo

risposta

31

appare come questa è la mia risposta: is_subclass_of

può accettare entrambi i parametri come stringhe

http://www.php.net/manual/en/function.is-subclass-of.php

+10

Nota che 'is_subclass_of' controlla solo i bambini e non corrisponderà se la classe data è uguale al secondo parametro : 'classe MyClass {} var_dump (is_subclass_of ('MyClass', 'MyClass')); var_dump (is_subclass_of (new MyClass(), 'MyClass')); ' Risultato: ' booleano falso falso booleano' – CDuv

+5

Puoi anche usare 'is_a()' e passare in 'TRUE' come terzo parametro per consentire le stringhe . – Boom

+1

La risposta è stata risposta da @United – Alaeddine

3

È possibile utilizzare questo?

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

Dalla pagina:

get_parent_class

(PHP 4, PHP 5, PHP 7)
get_parent_class - Recupera la classe padre nome per oggetto o la classe

Descrizione

string get_parent_class ([ mixed $object ]) 

Recupera il nome della classe genitore per oggetto o classe.

+1

Che dire di interfacce? – ircmaxell

+0

http://php.net/manual/en/function.is-subclass-of.php#89615 – llange

-1

instanceof() è generalmente considerato una cattiva pratica. Vedi this forum thread per una spiegazione (scritta per Java, ma non specifica).

Detto, PHP equivalente di questa funzione è l'operatore instanceof, come in:

$a = new MyClass; 

if($a instanceof MyClass) { 
    CODE 
} 

Vedi the documentation.

+5

COSA? può essere abusato, ma quale strumento migliore è lì per abilitare l'uso delle interfacce? Finché non sei stupido, è piuttosto potente. E per non parlare del fatto che la tua risposta non aggiunge nessuna nuova informazione, perché parla di classi e non di istanze (errore '' foo 'instanceof' bar'' errore). ... – ircmaxell

+0

Scusa, non era chiaro nel suo domanda inedita. Inoltre, potresti anche essere interessato a questo: http://www.canonical.org/~kragen/isinstance/ – syrion

7

bene, prima: instanceof è buona norma, prima di tutto è molto più veloce, secondo è semplice da guardare, ed è più OOP .. secondo: facendo questo campione, dovrebbe essere chiaro che c'è un motivo per cui "instanceof" non funziona sulle stringhe, perché può essere usato come un "identificatore" per una classe ..

$temp ="tester"; 
$object = new sub(); 
var_dump($object instanceof $temp); //prints "true" on php 5.3.8 

class tester{} 

class sub extends \tester{ 

} 

hanno anche provato su una scala più grande di questo semplice caso. e di causa, funziona su interfacce .. Hai solo bisogno di una variabile per contenere il nome assoluto della classe (incluso il namespace ..se si vuole essere sicuri al 100%)

+1

Funziona con variabili ma non stringhe letterali (... 'instanceof" tester "'). Provalo adesso. –

1

Questa è una discussione precedente, ma per riferimento futuro è possibile utilizzare le funzioni is_a e is_subclass_of per ottenere ciò in modo più efficiente. Non c'è bisogno di istanziare nulla, si può solo passare la stringa del tipo:

if (is_subclass_of($myObject, 'SomeClass')) // is_a(...) 
    echo "yes, \$myObject is a subclass of SomeClass\n"; 
else 
    echo "no, \$myObject is not a subclass of SomeClass\n"; 

Documenti PHP:

http://www.php.net/manual/en/function.is-a.php 
http://www.php.net/manual/en/function.is-subclass-of.php 
+2

Ricorda che 'is_a()' e 'is_subclass_of()' non sono equivalenti. Una classe non è una sottoclasse di se stessa. – Boom

Problemi correlati