Php как найти класс

(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

  • Read
  • Discuss
  • 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): boolCode language: PHP (php)

    The class_exists() function has two parameters:

    • $class specifies the name of the class to check.
    • $autoload determines whether to call spl_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 existsCode 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 existCode 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 existCode 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 existsCode 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 для начинающих

    • 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, который мы будем изучать в следующей статье. Однако простота и удобство использования в некоторых случаях делают эти функции более предпочтительными. По этой причине мы сейчас и приступим к их рассмотрению.

    Курс PHP для начинающих

    Поиск классов

    Функции 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());

    В результате будет выведен список встроенных и определенных пользователем классов. Помните, что данная функция возвращает только те классы, которые были объявлены к моменту ее вызова.

    Курс PHP для начинающих

    Получение информации об объекте или классе

    Как вы знаете, с помощью уточнений типов классов можно ограничить тип аргументов метода некоторого объекта. Но даже используя эту возможность, не всегда можно быть уверенным в отношении типа объекта. Существует ряд основных средств для проверки типа объекта. Прежде всего, мы можем узнать класс объекта с помощью функции 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';

    Курс PHP для начинающих

    Получение информации о методах

    Чтобы получить список всех методов класса, можно воспользоваться функцией get_class_methods(). В качестве аргумента ей передается имя класса, а она возвращает массив, содержащий имена всех методов класса:

    Код PHP

    foreach (get_class_methods('CDProduct') as $key=>$value) {
    	echo "<b>$key</b> => {$value}()<br>";
    }

    Получение всех методов класса CDProduct

    В этом примере мы передаем имя класса функции get_class_methods() и выводим возвращенный ею массив с помощью цикла foreach. Мы могли бы также передать функции get_class_methods() объект и получили бы такой же результат. Если вы используете не самую старую версию PHP, то в возвращенный список будут включены только имена общедоступных методов.

    Курс PHP для начинающих

    Получение информации о свойствах

    Точно так же, как можно запросить список методов класса, можно запросить и список его полей. Функции get_class_vars() передается имя класса, а она возвращает ассоциативный массив. Имена полей сохраняются в виде ключей этого массива, а значения полей — в виде значений.

    Курс PHP для начинающих

    Получение информации о наследовании

    С помощью функций для работы с классами можно также выявлять отношения наследования. Например, с помощью функции 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().

    Сборки и пространства имен

    Рефлексия

    Оценить статью:

    Добавить комментарий