This function considers only classes and subclasses. Not subsubclasses.
In fact I have code that provides an abstract class and then classes using this abstract class. Further I have subclasses to my concrete classes - which is why my subclasses are not listed within the returned array.
get_declared_classes
(PHP 4, PHP 5)
get_declared_classes — Devuelve una matriz con el nombre de las clases definidas
Descripción
Obtiene las clases declaradas.
Valores retornados
Devuelve una matriz de los nombres de las clases declaradas en el script actual.
Note: En PHP 4.0.1, tres clases adicionales son devueltas al comienzo de la matriz: stdClass (definida en Zend/zend.c), OverloadedTestClass (definida en ext/standard/basic_functions.c) y Directory (definida en ext/standard/dir.c).
También note que dependiendo de las extensiones que haya compilado o cargado en PHP, clases adicionales pueden estar presentes. Esto quiere decir que no podrá definir sus propias clases usando estos nombres. Existe una lista de clases predefinidas en la sección Clases Predefinidas de los apéndices.
Ejemplos
Example #1 Ejemplo de get_declared_classes()
<?php
print_r(get_declared_classes());
?>
El resultado del ejemplo seria algo similar a:
Array ( [0] => stdClass [1] => __PHP_Incomplete_Class [2] => Directory )
get_declared_classes
29-Feb-2008 06:23
25-Sep-2007 08:32
Summary:
* in PHP 5.1 class names have case preserved
* contrary, in PHP 4.4 class names are downcased, withe exception of a few build-in ones
The get_declared_classes() funcition returns the list of names with case preserved, as of PHP 5.1 series (prolly 5.0 too, but i have no way to test it right now). Since PHP generally is caseless in regard to names of classes, this may come at a surprise. Also, this could potentially break older code asssuming downcased list.
Take extra care when checking for existence of a class. Following example is, potentially, error prone: <?php in_array( $className, $classget_declared_classes() ) ?>
A sure-fire (while slower) way would be to iterate over the array and normalize case to, say, lower:
<?php
$exists = FALSE;
$className = strtolower( $className );
foreach ( get_declared_classes() as $c ) {
if ( $className === strtolower( $c ) ) {
$exists = TRUE;
break;
}
}?>
Optimization of the above snippet is left as a simple excercise to the reader ;)
-- dexen deVries
21-Dec-2005 11:58
classes can't be unloaded. probably not very practical to implement that in a future version. I wouldn't go out of my way to do it if I were zend. you're better off finding a workaround. it's better programming technique to find a way around having to do that anyway.
http://www.zend.com/zend/week/week223.php#Heading10
Regarding note of 3-21:
<?php
class myclass {}
$class = 'myclass';
$instance = new $class();
?>
This function could also be used to determine the names of classes defined in a particular file by calling it before and after include. It's hardly a pointless function.
01-Nov-2004 04:41
The array returned by this function will be in the order the classes were defined / included / required and this order does not appear to change.
For example:
<?PHP
//define classone
class classone { }
//define classtwo
class classtwo { }
//This will show X classes (built-ins, extensions etc) with
//classone and classtwo as the last two elements
print_r(get_declared_classes());
//define classthree
class classthree { }
//...and four
class classfour { }
//Shows the same result as before with class three and four appended
print_r(get_declared_classes());
?>
Output:
Array
(
[0] => stdClass
[1] .... other defined classes....
[10] => classone
[11] => classtwo
)
and...
Array
(
[0] => stdClass
[1] .... other defined classes....
[10] => classone
[11] => classtwo
[12] => classthree
[13] => classfour
)
07-Feb-2004 08:52
In PHP5, you don't get declared interfaces by calling this function!!!
To get interfaces you should use get_declared_interfaces(). However, to check if an interface is already defined, you should use class_exists()! This is strange, but PHP team does not think so.
21-Mar-2003 12:06
you cannot remove them. they are "defined", which happens when the class is being loaded from the parser. you just deleted an instance of a class.
23-Jan-2003 10:01
Note that classes remain in the declared list, even when their associated object is undef'd.
eg:
$object = new MyClass;
print_r(get_declared_classes());
undef($object);
print_r(get_declared_classes());
- the two print_r's will return the same data.
Not sure how to remove a class from the declared list.
