• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 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();
    }
    ?>
    

    参见

    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());
    ?>
    

    上篇:class_alias()

    下篇:get_called_class()