Check if class is included php

class_exists

Cette fonction vérifie si une classe donnée a été définie.

Liste de paramètres

Le nom de la classe. Il est recherché de manière insensible à la casse.

Si l’on doit appeler autoload par défaut.

Valeurs de retour

Retourne true si class est une classe définie, false sinon.

Exemples

Exemple #1 Exemple avec class_exists()

// Vérifie que la classe existe avant de l’utiliser
if ( class_exists ( ‘MyClass’ )) $myclass = new MyClass ();
>

Exemple #2 Exemple avec le paramètre autoload

spl_autoload_register (function ( $class_name ) include $class_name . ‘.php’

// Vérifie si l’include a déclaré la classe
if (! class_exists ( $class_name , false )) throw new LogicException ( «Unable to load class: $class_name » );
>
>);

if ( class_exists ( MyClass ::class)) $myclass = new MyClass ();
>

Voir aussi

  • function_exists() — Indique si une fonction est définie
  • enum_exists() — Vérifie si l’énumération est définie
  • interface_exists() — Vérifie si une interface a été définie
  • get_declared_classes() — Liste toutes les classes définies dans PHP

User Contributed Notes 9 notes

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

Note: class_exists() check only classes!
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:
/**
* 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 );
>
?>

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.

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.

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
class Second <>
?>
file index.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..

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

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.

/**
* 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.

/**
* 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!

If spl_autoload_register() had been called, then function will try autoload class if it does not exists.

Use instead
in_array ( $class_name , get_declared_classes ());
?>

  • Fonctions Classes/Objets
    • class_​alias
    • class_​exists
    • enum_​exists
    • get_​called_​class
    • get_​class_​methods
    • get_​class_​vars
    • get_​class
    • get_​declared_​classes
    • get_​declared_​interfaces
    • get_​declared_​traits
    • get_​mangled_​object_​vars
    • get_​object_​vars
    • get_​parent_​class
    • interface_​exists
    • is_​a
    • is_​subclass_​of
    • method_​exists
    • property_​exists
    • trait_​exists
    • _​_​autoload

    Источник

    class_exists

    This function checks whether or not the given class has been defined.

    Parameters

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

    Whether to autoload if not already loaded.

    Return Values

    Returns true if class is a defined class, false otherwise.

    Examples

    Example #1 class_exists() example

    // Check that the class exists before trying to use it
    if ( class_exists ( ‘MyClass’ )) $myclass = new MyClass ();
    >

    Example #2 autoload parameter example

    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

    • function_exists() — Return true if the given function has been defined
    • enum_exists() — Checks if the enum has been defined
    • interface_exists() — Checks if the interface has been defined
    • get_declared_classes() — Returns an array with the name of the defined classes

    User Contributed Notes 9 notes

    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

    Note: class_exists() check only classes!
    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:
    /**
    * 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 );
    >
    ?>

    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.

    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.

    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
    class Second <>
    ?>
    file index.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..

    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

    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.

    /**
    * 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.

    /**
    * 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!

    If spl_autoload_register() had been called, then function will try autoload class if it does not exists.

    Use instead
    in_array ( $class_name , get_declared_classes ());
    ?>

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