(PHP 4, PHP 5, PHP 7, PHP 8)
class_exists — Проверяет, был ли объявлен класс
Описание
class_exists(string $class
, bool $autoload
= true
): bool
Список параметров
-
class
-
Имя класса. Воспринимается без учёта регистра.
-
autoload
-
Нужно ли автоматически подгружать класс,
если он ещё не загружен.
Возвращаемые значения
Возвращает true
, если класс class
объявлен,
иначе false
.
Примеры
Пример #1 Пример использования class_exists()
<?php
// Проверяем существование класса перед его использованием
if (class_exists('MyClass')) {
$myclass = new MyClass();
}?>
Пример #2 Пример использования c параметром autoload
<?php
spl_autoload_register(function ($class_name) {
include $class_name . '.php';// Проверяем необходимость подключения указанного класса
if (!class_exists($class_name, false)) {
throw new LogicException("Unable to load class: $class_name");
}
});
if (
class_exists(MyClass::class)) {
$myclass = new MyClass();
}?>
Смотрите также
- function_exists() – Возвращает true, если указанная функция определена
- enum_exists() – Проверяет, определено ли перечисление
- interface_exists() – Проверяет, определён ли интерфейс
- get_declared_classes() – Возвращает массив с именами объявленных классов
giunta dot gaetano at gmail dot com ¶
9 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 anamespacedclassname as coolclass;
class_exists( 'coolclass' ) => false
info at ensostudio dot ru ¶
2 years ago
Note: class_exists() check only classes!
<?php
interface DemoInterface {};
var_dump(class_exists('DemoInterface')); // false
trait DemoTrait {};
var_dump(class_exists('DemoTrait')); // false
class DemoClass {};
var_dump(class_exists('DemoClass')); // true
?>
Common function:
<?php
/**
* Checks if the class/trait/interface has been defined.
*
* @param string $name The case-insensitive name of class/trait/interface
* @param bool $autoload Whether to call spl_autoload()
* @return bool
*/
function structure_exists(string $name, bool $autoload = true): bool
{
return class_exists($name, $autoload)
|| interface_exists($name, $autoload)
|| trait_exists($name, $autoload);
}
?>
rn at alpha9marketing dot com ¶
9 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 ¶
13 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 ¶
9 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
<?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..
richard at richard-sumilang dot com ¶
15 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 ¶
19 years ago
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
toocoolone at gmail dot com ¶
11 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.
<?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!
azrael dot com at gmail dot com ¶
14 years ago
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());
?>
PHP | class_exists() Function
Improve Article
Save Article
Like Article
Improve Article
Save Article
Like Article
The class_exists() function is an inbuilt function in PHP which is used to check whether the given class is defined or not.
Syntax:
bool class_exists( string $class_name, bool $autoload = TRUE )
Parameters: This function accept two parameters as mentioned above and described below:
- $class_name: It holds the class name which need to check their existence.
- $autoload: It checks whether the __autoload is called or not by default.
Return Value: This function returns True if class name is defined otherwise returns False.
Below programs illustrate the class_exists() function in PHP:
Program 1:
<?php
class
GFG {
public
$Geek_name
=
"Welcome to GeeksforGeeks"
;
}
if
(
class_exists
(
'GFG'
)) {
echo
"Class name exists"
;
}
else
{
echo
"Class name does not exist"
;
}
?>
Program 2:
<?php
class
GFG {
public
$data1
;
public
$data2
;
public
$data3
;
}
if
(
class_exists
(
'GFG'
)) {
$obj
=
new
GFG();
$obj
->data1 =
"Geeks"
;
$obj
->data2 =
"for"
;
$obj
->data3 =
"Geeks"
;
echo
"$obj->data1 n$obj->data2 n$obj->data3"
;
}
else
{
echo
"Class does not exist"
;
}
?>
Reference: https://www.php.net/manual/en/function.class-exists.php
Last Updated :
27 Apr, 2020
Like Article
Save Article
Summary: in this tutorial, you’ll learn how to use the PHP class_exists()
function to check if a class exists or not.
Introduction to the PHP class_exists() function
The class_exists()
function accepts a class name and returns true
if the class exists or false
otherwise.
class_exists(string $class, bool $autoload = true): bool
Code language: PHP (php)
The class_exists()
function has two parameters:
$class
specifies the name of the class to check.$autoload
determines whether to callspl_autoload_register()
by default.
Note that the class_exists()
is case-insensitive. It means that if you have a class with the name User
, the class_exists(‘user’) will return true.
The class_exists()
function is often used in model-view-controller (MVC) frameworks to load the controller class based on a route.
PHP class_exists() function examples
Let’s take some examples of using the class_exists()
function.
1) Using the PHP class_exists() function to check if a class exists
First, define a class User
in the User.php
file:
<?php
class User
{
}
Code language: PHP (php)
Second, require the User.php
file in the index.php and use the class_exists()
function to check if the User
class exists:
<?php
require 'User.php';
if (class_exists('User')) {
echo 'The class User exists';
} else {
echo 'The class User does not exist';
}
Code language: PHP (php)
Since the require
construct loads the User.php
class, you’ll see the following output:
The class User exists
Code language: PHP (php)
If you comment the require
statement and execute the script again, you’ll see the following output:
The class User does not exist
Code language: PHP (php)
2) Using the PHP class_exists() function to check if a namedspaced clas exists
First, add the App
namespace to the User
class:
<?php
namespace App;
class User
{
}
Code language: PHP (php)
Second, execute the following script:
<?php
require 'User.php';
if (class_exists('User')) {
echo 'The class User exists';
} else {
echo 'The class User does not exist';
}
Code language: PHP (php)
… you’ll see the following output:
The class User does not exist
Code language: PHP (php)
The reason is that the User
class is namespaced. The class name is AppUser
, not User
.
To fix this, you can use the fully-qualified class name like this:
<?php
require 'User.php';
if (class_exists('AppUser')) {
echo 'The class AppUser exists';
} else {
echo 'The class ApppUser does not exist';
}
Code language: PHP (php)
If you execute the script again, you’ll see this output:
The class AppUser exists
Code language: PHP (php)
3) Using the class_exists() with the class alias
The class_exists()
doesn’t work with the aliased class name. For example:
require 'User.php';
use AppUser as Account;
var_dump(class_exists('Account')); // bool(false)
Code language: PHP (php)
4) Using the PHP class_exists() with spl_autoload_register() example
First, define the User
class in the User.php
file in the app
folder as follows:
<?php
namespace App;
class User
{
public function avartar(): string
{
return 'default';
}
}
Code language: PHP (php)
Second, create an index.php
file in the root folder and place the following code:
<?php
spl_autoload_register(function ($class) {
echo 'Loading the class ' . $class . '<br>';
require $class . '.php';
});
class_exists('AppUser');
echo 'Create a new user' . '<br>';
$user = new AppUser();
echo $user->avartar();
Code language: PHP (php)
Output:
Loading the class AppUser
Create a new user
default{"mode":"full","isActive":false}
Code language: PHP (php)
How it works.
First, the class_exists()
function checks whether the AppUser
class exists and call the spl_autoload_register()
function to load the User.php
file from the app
folder.
Second, create a new instance of the class AppUser
and call the avartar()
method.
Summary
- Use the PHP
class_exists()
function to check if a class exists or not. - Use the fully-qualified name for the class if the class is namespaced.
Did you find this tutorial useful?
Пытаюсь проверить через class_exists – функция почему-то не работает.
У class_exists
есть дурацкое свойство пробовать автозагружать класс, если второй аргумент выставлен в true
(это значение по умолчанию). Функция проверяет не наличие класса в текущем рантайме, а наличие класса в приложении – доступен ли он, если сейчас будет создан новый инстанс с помощью new
. В момент подзагрузки PHP обратится к вашему автозагрузчику, который однозначно попытается загрузить файл, причем не include_once
, после которого еще можно спасти ситуацию, а require_once
, и делаете вы это даже без проверки на существование файла. Поэтому у вас потенциально убийственная ситуация что с new
, что с class_exists
.
Что делать?
В первую очередь автозагрузчик никогда не должен делать потенциально разрушительных действий. Их может быть много, система автозагрузчиков PHP устроена так, чтобы могло прийти двенадцать людей, установить по загрузчику, и все они отработали – если один не справился, в ход идет следующий. Поэтому ваш автозагрузчик должен просто ничего не делать, если он не может найти класс.
Второе, о чем стоит сказать, так это о менеджере зависимостей Composer. Мне безумно не нравится, что он объединяет в себе функуции менеджера зависимостей и автозагрузчика, но в данный момент он является стандартом индустрии, поэтому проще всего было бы возложить автозагрузку на него.
Если же вы все-таки хотите написать свой собственный загрузчик – вам нужно сделать в нем проверку существования файла и регистрацию директории, относительно которой отсчитывать. Еще лучше это сделать согласно стандарту PSR-4, по которому работает автозагрузчик Composer. Насколько понимаю, первое предупреждение у вас из-за того, что вы указываете include_path
от балды, и PHP сначала ищет класс там.
В любом случае после реализации корректного загрузчика вы сможете беспроблемно использовать class_exists
для проверки существования класса.
Функции для работы с классами и объектами
- PHP и MySQL
- ООП в PHP
- Функции для работы с классами и объектами
В PHP предусмотрен широкий набор функций для тестирования классов и объектов. Для чего это нужно? Вы, наверняка, сами написали большинство классов, которые используются в сценарии. На самом деле во время выполнения программы не всегда известно, какие классы используются. Например, вы могли разработать систему для “прозрачной” работы со сложными классами, разработанными сторонними производителями. В подобном случае экземпляр объекта обычно создается только на основании имени класса. В PHP разрешается использовать строки, чтобы ссылаться на классы динамически, как показано ниже:
Код PHP
// Файл Task.php
namespace tasks;
class Task {
function doSpeak() {
echo "Привет!";
}
}
// Файл TaskRunner.php
$classname = "Task";
require_once "{$classname}.php";
$classname = "tasks\$classname";
$myObj = new $classname();
$myObj->doSpeak();
Строку, которую мы назначили переменной $classname, можно получить из файла конфигурации или путем сравнения данных веб-запроса с содержимым каталога. Затем можно использовать эту строку для загрузки файла класса и создания экземпляра объекта. Обратите внимание на то, что в приведенном выше фрагменте кода я указал перед именем класса пространство имен.
Обычно подобные операции выполняют, когда нужно, чтобы система могла выполнять созданные пользователем подключаемые дополнительные модули (plug-ins). Но прежде чем делать такие рискованные вещи в реальном проекте, вы должны проверить, что указанный класс существует, у него есть нужные вам методы и т.д.
В PHP 5 часть функций для работы с классами была заменена более мощным Reflection API, который мы будем изучать в следующей статье. Однако простота и удобство использования в некоторых случаях делают эти функции более предпочтительными. По этой причине мы сейчас и приступим к их рассмотрению.
Поиск классов
Функции class_exists() передается строка, содержащая имя класса. Она возвращает значение true, если класс существует, и false — в противном случае. С помощью этой функции можно сделать предыдущий фрагмент кода более безопасным:
Код PHP
// Файл TaskRunner.php
$classname = "Task";
$path = "{$classname}.php";
if ( !file_exists( $path )) {
throw new Exception( "Файл {$path} не найден" );
}
require_once( $path );
$qclassname = "tasks\$classname";
if ( !class_exists( $qclassname ) ) {
throw new Exception( "Класс $qclassname не найден" );
}
$myObj = new $qclassname();
$myObj->doSpeak();
Конечно, мы не можем быть уверенными, что для конструктора рассматриваемого класса не потребуются аргументы. Для достижения такого уровня безопасности программирования необходимо обратиться к Reflection API, который мы будем изучать в следующей статье. Тем не менее перед его использованием с помощью функции class_exists() мы должны убедиться в том, что нужные нам классы существуют.
Не забывайте, что всегда следует с осторожностью относиться к данным, полученным из внешних источников, и проверять их перед использованием в своем сценарии. В случае получения пути и имени файла следует экранировать или удалять точки и разделители каталогов, тем самым предотвращается возможность взлома сайта, когда недобросовестный пользователь может заменить имена каталогов и включить в них нежелательные файлы.
Чтобы получить массив всех классов, определенных в сценарии, можно воспользоваться функцией get_declared_classes():
Код PHP
print_r(get_declared_classes());
В результате будет выведен список встроенных и определенных пользователем классов. Помните, что данная функция возвращает только те классы, которые были объявлены к моменту ее вызова.
Получение информации об объекте или классе
Как вы знаете, с помощью уточнений типов классов можно ограничить тип аргументов метода некоторого объекта. Но даже используя эту возможность, не всегда можно быть уверенным в отношении типа объекта. Существует ряд основных средств для проверки типа объекта. Прежде всего, мы можем узнать класс объекта с помощью функции get_class(). В качестве аргумента ей передается объект любого типа, а она возвращает в виде строки его имя класса (для проработки последующих примеров вам понадобится структура класса ShopProduct, которую мы определили к данному моменту и вспомогательные классы – исходный код):
Код PHP
function getProduct() {
return new CDProduct('Первый снег', 'Группа',
'Моральный кодекс', 2.99, 55.01);
}
$product = getProduct();
if (get_class($product) == 'CDProduct')
echo '$product - объект класса CDProduct';
Функция getProduct() просто создает экземпляр объекта CDProduct и возвращает его. Мы воспользуемся данной функцией в этом разделе. Функция get_class() выдает очень специфическую информацию. Обычно же нужна более общая информация о принадлежности к семейству классов. Предположим, нам нужно знать, что объект принадлежит семейству ShopProduct, но при этом не имеет значения, к какому классу конкретно: BookProduct или CDProduct. Для этой цели в PHP предусмотрен оператор instanceof.
Оператор instanceof работает с двумя операндами: объектом, который нужно протестировать (указывается слева от ключевого слова instanceof), и именем класса или интерфейса справа. Оператор возвращает значение true, если объект является экземпляром класса указанного типа:
Код PHP
$product = getProduct();
if ($product instanceof ShopProduct)
echo '$product - объект класса CDProduct';
Получение информации о методах
Чтобы получить список всех методов класса, можно воспользоваться функцией get_class_methods(). В качестве аргумента ей передается имя класса, а она возвращает массив, содержащий имена всех методов класса:
Код PHP
foreach (get_class_methods('CDProduct') as $key=>$value) {
echo "<b>$key</b> => {$value}()<br>";
}
В этом примере мы передаем имя класса функции get_class_methods() и выводим возвращенный ею массив с помощью цикла foreach. Мы могли бы также передать функции get_class_methods() объект и получили бы такой же результат. Если вы используете не самую старую версию PHP, то в возвращенный список будут включены только имена общедоступных методов.
Получение информации о свойствах
Точно так же, как можно запросить список методов класса, можно запросить и список его полей. Функции get_class_vars() передается имя класса, а она возвращает ассоциативный массив. Имена полей сохраняются в виде ключей этого массива, а значения полей — в виде значений.
Получение информации о наследовании
С помощью функций для работы с классами можно также выявлять отношения наследования. Например, с помощью функции get_parent_class() можно узнать имя родительского класса для указанного класса. Этой функции передается ссылка на объект или имя класса, а она возвращает имя суперкласса, если таковой существует. Если же такого класса нет, т.е. если у проверяемого класса нет родительского класса, то функция вернет значение false. В результате вызова
Код PHP
echo get_parent_class('CDProduct');
мы получим имя родительского класса ShopProduct, как и можно было ожидать.
С помощью функции is_subclass_of() можно также проверить, является ли класс дочерним для другого класса. Этой функции передается ссылка на дочерний объект и имя родительского класса. Функция возвращает значение true, если второй класс является суперклассом первого аргумента:
Код PHP
function getProduct() {
return new CDProduct('Первый снег', 'Группа',
'Моральный кодекс', 2.99, 55.01);
}
$product = getProduct(); // Получим объект
if (is_subclass_of($product, 'ShopProduct'))
echo 'CDProduct является подклассом класса ShopProduct';
Функция is_subclass_of() сообщит информацию только об отношениях наследования в классе. Но она не поможет вам узнать, реализует ли класс интерфейс. Для этой цели следует использовать оператор instanceof. Кроме того, можно воспользоваться функцией class_implements(), которая является частью SPL (Standard PHP Library — стандартная библиотека PHP). Этой функции передается имя класса или ссылка на объект, а она возвращает массив имен интерфейсов:
Код PHP
$product = getProduct();
if (in_array('IChargeable', class_implements($product)))
echo 'CDProduct реализует интерфейс IChargeable';
Прежде чем отобразить результат, в этом коде мы проверяем, есть ли имя интерфейса в массиве, возвращенном функцией class_implements().