class_exists()
(PHP 4, PHP 5, PHP 7)
检查类是否已定义
说明
class_exists(string $class_name[,bool $autoload= true]): bool
检查指定的类是否已定义。
参数
- $class_name
类名。名字的匹配是不分区大小写的。
- $autoload
是否默认调用__autoload。
返回值
如果由$class_name所指的类已经定义,此函数返回TRUE
,否则返回FALSE
。
更新日志
版本 | 说明 |
---|---|
5.0.2 | 不再为已定义的 interface 返回TRUE 。请使用interface_exists()。 |
范例
Example #1class_exists()例子
<?php // 使用前检查类是否存在 if (class_exists('MyClass')) { $myclass = new MyClass(); } ?>
Example #2$autoloadparameter 例子
<?php function __autoload($class) { include($class . '.php'); // Check to see whether the include declared the class if (!class_exists($class, false)) { trigger_error("Unable to load class: $class", E_USER_WARNING); } } if (class_exists('MyClass')) { $myclass = new MyClass(); } ?>
参见
function_exists()
如果给定的函数已经被定义就返回 TRUEinterface_exists()
检查接口是否已被定义get_declared_classes()
返回由已定义类的名字所组成的数组
If you are using aliasing to import namespaced classes, take care that class_exists will not work using the short, aliased class name - apparently whenever a class name is used as string, only the full-namespace version can be used use a\namespaced\classname as coolclass; class_exists( 'coolclass' ) => false
If you recursively load several classes inside an autoload function (or mix manual loading and autoloading), be aware that class_exists() (as well as get_declared_classes()) does not know about classes previously loaded during the *current* autoload invocation. Apparently, the internal list of declared classes is only updated after the autoload function is completed.
Beware: class_exists is case-INsensitive, as is class instantiation. php > var_dump(class_exists("DomNode")); bool(true) php > var_dump(class_exists("DOMNode")); bool(true) php > var_dump(class_exists("DOMNodE")); bool(true) php > $x = new DOMNOdE(); php > var_dump(get_class($x)); string(7) "DOMNode" (tested with PHP 5.5.10 on Linux) This can cause some headaches in correlating class names to file names, especially on a case-sensitive file system.
Hi guys! Be careful and don't forget about second boolean argument $autoload (TRUE by default) when check exists class after spl_autoload_register. Propose short example file second.php <?php class Second {} ?> file index.php <?php class First { function first($class, $bool) { spl_autoload_register( function($class) { require strtolower($class) . '.php'; }); echo class_exists($class, $bool)?'Exist!!!!':'Not exist!'; } } new First($class = 'Second', $bool = true); //Exist!!!! new First($class = 'Second', $bool = false); //Not exist! ?> Because __autoload executing much earlier than boolean returned, imho..
I'm running PHP 5.3.4 on Windows 7 and had some difficulty autoloading classes using class_exists(). In my case, when I checked for the class and it didn't exist, class_exists automatically threw a system Exception. I was also throwing my own exception resulting in an uncaught exception. <?php /** * Set my include path here */ $include_path = array( '/include/this/dir', '/include/this/one/too' ); set_include_path( $include_path ); spl_autoload_register(); /** * Assuming I have my own custom exception handler (MyException) let's * try to see if a file exists. */ try { if( ! file_exists( 'myfile.php' ) ) { throw new MyException('Doh!'); } include( 'myfile.php' ); } catch( MyException $e ) { echo $e->getMessage(); } /** * The above code either includes myfile.php or throws the new MyException * as expected. No problem right? The same should be true of class_exists(), * right? So then... */ $classname = 'NonExistentClass'; try { if( ! class_exists( $classname ) ) { throw new MyException('Double Doh!'); } $var = new $classname(); } catch( MyException $e ) { echo $e->getMessage(); } /** * Should throw a new instance of MyException. But instead I get an * uncaught LogicException blah blah blah for the default Exception * class AND MyException. I only catch MyException so we've got on * uncaught resulting in the dreaded LogicException error. */ ?> By registering an additional autoload handler function that did nothing, I was able to stop throwing the extra Exception and only throw my own. <?php /** * Set my include path here */ $include_path = array( '/include/this/dir', '/include/this/one/too' ); set_include_path( $include_path ); spl_autoload_register(); spl_autoload_register( 'myAutoLoad' ); // Add these two and no worries... function myAutoLoad() {} /** * By registering the additional custom autoload function that does nothing * class_exists() returns only boolean and does NOT throw an uncaught Exception */ ?> Found this buried in some search results. I don't remember the page URL but if it would have been here it might have saved me some time!
[ >= PHP 5.3] If you are checking if a class exists that is in a specific namespace then you have to pass in the full path to the class: echo (class_exists("com::richardsumilang::common::MyClass")) ? "Yes" : "No";
If you have a directory of classes you want to create. (Modules in my instance)... you can do it like that <?php if (is_dir($this->MODULE_PATH) && $dh = opendir($this->MODULE_PATH)) { while (($file = readdir($dh)) !== false) { if (preg_match("/(Mod[a-zA-Z0-9]+).php/", $file, $matches)>0) { // include and create the class require_once($this->MODULE_PATH."/".$file); $modules[] = new $matches[1](); } } } else { exit; } ?> //--- Here the rule is that all modules are on the form ModModulename.php and that the class has the same name as the file. The $modules array has all the classes initialized after this code
If spl_autoload_register() had been called, then function will try autoload class if it does not exists. Use instead <?php in_array($class_name, get_declared_classes()); ?>