PHP: Hypertext Preprocessor (original) (raw)

class_exists

(PHP 4, PHP 5, PHP 7, PHP 8)

class_exists — Checks if the class has been defined

Description

Parameters

class

The class name. The name is matched in a case-insensitive manner.

autoload

Whether to autoload if not already loaded.

Return Values

Returns [true](reserved.constants.php#constant.true) if class is a defined class,[false](reserved.constants.php#constant.false) otherwise.

Examples

Example #1 class_exists() example

<?php // Check that the class exists before trying to use it if (class_exists('MyClass')) { $myclass = new MyClass(); }?>

Example #2 autoload parameter example

`<?php
spl_autoload_register(function ($class_name) {
include $class_name . '.php';// Check to see whether the include declared the class
if (!class_exists($class_name, false)) {
throw new LogicException("Unable to load class: $class_name");
}
});

if (

class_exists(MyClass::class)) {
$myclass = new MyClass();
}?>`

See Also

Found A Problem?

giunta dot gaetano at gmail dot com

11 years ago

`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

`

info at ensostudio dot ru

4 years ago

`Note: class_exists() check only classes!

Common function:
<?php
/**

rn at alpha9marketing dot com

11 years ago

`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.

`

Klaus

15 years ago

`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.

`

spam at wikicms dot org

11 years ago

`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

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..`

sb at firstvector dot org

10 months ago

`` Beware that \class_exists() returns true for enums.

Having this in mind, the correct check for a class existence is:

``

richard at richard-sumilang dot com

17 years ago

`[ >= 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";

`

anonymous at somewhere dot tld

21 years ago

`If you have a directory of classes you want to create. (Modules in my instance)... you can do it like that

MODULE_PATH) && dh=opendir(dh = opendir(dh=opendir(this->MODULE_PATH)) { while (($file = readdir($dh)) !== false) { if (preg_match("/(Mod[a-zA-Z0-9]+).php/", file,file, file,matches)>0) { // include and create the class require_once($this->MODULE_PATH."/".$file); modules[]=newmodules[] = new modules[]=newmatches[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

`

toocoolone at gmail dot com

13 years ago

`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.

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=newvar = new var=newclassname(); } 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.

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!

`