2011-01-06 8 views
20

Lo mejor es explicarlo con un ejemplo. Busco una función "theFunctionILookFor" que haga que el código funcione.PHP: instancia equivalente para un nombre de clase representado por una cadena

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

corregir: Intento evitar crear una instancia de la clase solo para realizar esta comprobación. Me gustaría poder pasar 2 parámetros de cadena a la función de verificación

Respuesta

31

Parece que esta es mi respuesta: is_subclass_of

puede aceptar ambos parámetros como cadenas

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

+10

Tenga en cuenta que 'is_subclass_of' marca solo para niños y no coincidirá si la clase dada es igual que el segundo parámetro : 'class MyClass {} var_dump (is_subclass_of ('MyClass', 'MyClass')); var_dump (is_subclass_of (new MyClass(), 'MyClass')); ' Resultado: ' boolean false boolean false' – CDuv

+5

También puede usar 'is_a()' y pasar 'TRUE' como tercer parámetro para permitir cadenas . – Boom

+1

La respuesta fue respondida por @Unsigned – Alaeddine

3

Puede utilizar esto?

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

Desde la página:

get_parent_class

(PHP 4, PHP 5, PHP 7)
get_parent_class - Recupera la clase padre nombre por objeto o clase

Descripción

string get_parent_class ([ mixed $object ]) 

recupera el nombre de la clase padre por objeto o clase.

+1

¿Qué pasa con las interfaces? – ircmaxell

+0

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

-1

instanceof() generalmente se considera una mala práctica. Consulte this forum thread para obtener una explicación (escrita para Java, pero no específica de ella).

Dicho esto, el PHP equivalente de esta función es el operador instanceof, como en:

$a = new MyClass; 

if($a instanceof MyClass) { 
    CODE 
} 

Ver the documentation.

+5

¿QUÉ? se puede abusar, pero ¿qué mejor herramienta hay para permitir el uso de interfaces? Mientras no seas estúpido al respecto, es bastante poderoso. Y sin mencionar que su respuesta no agrega ninguna información nueva, porque él está hablando de clases y no de instancias ('' foo 'instanceof' bar'' será un error) ... – ircmaxell

+0

Lo siento, eso no estaba claro en su pregunta sin editar Además, también podría estar interesado en esto: http://www.canonical.org/~kragen/isinstance/ – syrion

7

así, en primer lugar: instanceof es una buena práctica, en primer lugar, es mucho más rápido, en segundo lugar es fácil de ver, y es más POO .. segundo: haciendo esta muestra, debe quedar claro que hay una razón por la cual "instanceof" no funciona en las cuerdas, ya que puede ser utilizado como un "identificador" para una clase ..

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

class tester{} 

class sub extends \tester{ 

} 

también han tratado en una escala más grande que este caso sencillo. y de causa, funciona en interfaces. Solo necesita una variable para contener el nombre absoluto de la clase (incluido el espacio de nombres).si quiere estar 100% seguro)

+1

Funciona con variables pero no con literales de cadena (... 'instanceof" tester "'). Probándolo ahora. –

1

Este es un hilo viejo, pero aún para futuras referencias, puede usar las funciones is_a y is_subclass_of para lograr esto de una manera más eficiente. No hay necesidad de crear instancias de nada, sólo puede pasar su cadena como:

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"; 

Docs PHP:

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

Tenga en cuenta que 'is_a()' y 'is_subclass_of()' no son equivalentes. Una clase no es una subclase de sí misma. – Boom

Cuestiones relacionadas