• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • is_subclass_of()

    (PHP 4, PHP 5, PHP 7)

    如果此对象是该类的子类,则返回TRUE

    说明

    is_subclass_of(object $object,string $class_name): bool

    如果对象$object所属类是类$class_name的子类,则返回TRUE,否则返回FALSE

    Note:

    自 PHP 5.0.3 起也可以用一个字符串来指定$object参数(类名)。

    Example #1is_subclass_of()例子

    <?php
    // define a class
    class WidgetFactory
    {
      var $oink = 'moo';
    }
    // define a child class
    class WidgetFactory_Child extends WidgetFactory
    {
      var $oink = 'oink';
    }
    // create a new object
    $WF = new WidgetFactory();
    $WFC = new WidgetFactory_Child();
    if (is_subclass_of($WFC, 'WidgetFactory')) {
      echo "yes, \$WFC is a subclass of WidgetFactory\n";
    } else {
      echo "no, \$WFC is not a subclass of WidgetFactory\n";
    }
    if (is_subclass_of($WF, 'WidgetFactory')) {
      echo "yes, \$WF is a subclass of WidgetFactory\n";
    } else {
      echo "no, \$WF is not a subclass of WidgetFactory\n";
    }
    // usable only since PHP 5.0.3
    if (is_subclass_of('WidgetFactory_Child', 'WidgetFactory')) {
      echo "yes, WidgetFactory_Child is a subclass of WidgetFactory\n";
    } else {
      echo "no, WidgetFactory_Child is not a subclass of WidgetFactory\n";
    }
    ?>
    

    以上例程会输出:

    yes, $WFC is a subclass of WidgetFactory
    no, $WF is not a subclass of WidgetFactory
    yes, WidgetFactory_Child is a subclass of WidgetFactory
    

    参见get_class()、get_parent_class()和is_a()。

    参数

    $object

    A class name or an object instance

    $class_name

    The class name

    $allow_string

    If this parameter set to false, string class name as$objectis not allowed. This also prevents from calling autoloader if the class doesn't exist.

    返回值

    This function returnsTRUEif the object$object, belongs to a class which is a subclass of$class_name,FALSEotherwise.

    更新日志

    版本说明
    5.3.9Added$allow_stringparameter
    5.0.3You may also specify the$objectparameter as a string (the name of the class)

    范例

    Example #2is_subclass_of()example

    <?php
    // define a class
    class WidgetFactory
    {
      var $oink = 'moo';
    }
    // define a child class
    class WidgetFactory_Child extends WidgetFactory
    {
      var $oink = 'oink';
    }
    // create a new object
    $WF = new WidgetFactory();
    $WFC = new WidgetFactory_Child();
    if (is_subclass_of($WFC, 'WidgetFactory')) {
      echo "yes, $WFC is a subclass of WidgetFactory\n";
    } else {
      echo "no, $WFC is not a subclass of WidgetFactory\n";
    }
    if (is_subclass_of($WF, 'WidgetFactory')) {
      echo "yes, $WF is a subclass of WidgetFactory\n";
    } else {
      echo "no, $WF is not a subclass of WidgetFactory\n";
    }
    // usable only since PHP 5.0.3
    if (is_subclass_of('WidgetFactory_Child', 'WidgetFactory')) {
      echo "yes, WidgetFactory_Child is a subclass of WidgetFactory\n";
    } else {
      echo "no, WidgetFactory_Child is not a subclass of WidgetFactory\n";
    }
    ?>
    

    以上例程会输出:

    yes, $WFC is a subclass of WidgetFactory
    no, $WF is not a subclass of WidgetFactory
    yes, WidgetFactory_Child is a subclass of WidgetFactory
    

    注释

    Note:

    如果此类不是已知类,使用此函数会使用任何已注册的autoloader。

    参见

    is_subclass_of() works also with classes between the class of obj and the superclass.
    example:
    <?php
    class A {};
    class B extends A {};
    class C extends B {};
    $foo=new C();
    echo ((is_subclass_of($foo,'A')) ? 'true' : 'false');
    ?>
    echoes 'true' .
    This might be useful to someone, so:
    If you're using Autoload, you should be aware that this will attempt to autoload $classname if it isn't already loaded. I discovered this when I had something using is_subclass_of inside an error thrown by autoload, which then recursed until it ran out of memory.
    The $allow_string parameter is not very clearly documented. When true, it simply allows the first parameter to be the name of a class, instead of an object whose class we are interested in.
    Some usage examples:
    class parent_class {
      // objects and methods ...
    }
    $possible_child_object = new possible_child_class(); // might be an extension of parent_class
    $result = is_subclass_of($possible_child_object, 'parent_class'); // valid
    $result = is_subclass_of($possible_child_object, 'parent_class', false); // valid
    $result = is_subclass_of('possible_child_class', 'parent_class', true); // valid
    $result = is_subclass_of('possible_child_class', 'parent_class', false); // not valid
    It would appear that is_subclass_of is case insensitive unlike get_class in php5.
    i.e.
    <?php
    class fooBar {}
    class bar extends fooBar {}
    assert(get_class(new fooBar()) == "fooBar");
    assert(is_subclass_of(new bar(), "foobar") == true);
    ?>
    i run across this while migrating some code from php4 to php5 and the code would only half-the-time break.
    If you need something similar to is_subclass_of() to determine if a class implements an interface before instantiating it, use reflection:
    <?php
    interface A_Interface {}
    class A implements A_Interface {}
    $reflectionA = new ReflectionClass('A');
    var_dump(
      $reflectionA->implementsInterface('A_Interface')
    );
    ?>
    bool(true)
    For PHP4:
    <?php
    /** Returns whether specified class is subclass of the other class. */
    function is_subclass($sClass, $sExpectedParentClass){
      do if( $sExpectedParentClass === $sClass ) return true;
      while( false != ($sClass = get_parent_class($sClass)) );
      return false;
    }
    // Test:
    class A {} class B extends A {} class C extends B {} echo (int) is_subclass('C', 'A');
    ?>
    
    <?php
    interface I {
    }
    class A implements I {
    }
    class B extends A {
    }
    if (is_subclass_of('A', 'I')) {
      echo 'good<br>';
    }
    else {
      echo 'bad<br>';
    }
    if (is_subclass_of('B', 'I')) {
      echo 'good<br>';
    }
    else {
      echo 'bad<br>';
    }
    if (is_subclass_of('B', 'A')) {
      echo 'good<br>';
    }
    else {
      echo 'bad<br>';
    }
    ?>
    result:
    bad <- you must to describe intermediate class B to be good
    good
    good

    上篇:is_a()

    下篇:method_exists()