代码之家  ›  专栏  ›  技术社区  ›  Adam Franco

在静态方法中,是否有任何方法可以检测目标类?

  •  1
  • Adam Franco  · 技术社区  · 16 年前

    下面是一个示例类层次结构和代码。我正在寻找一种方法来确定“childClass1”或“childClass2”是否在不在每个子类中重新实现的情况下调用了静态方法whoami()。

    <?php
    
    abstract class ParentClass {
    
        public static function whoAmI () {
    
            // NOT correct, always gives 'ParentClass'
            $class = __CLASS__;
    
            // NOT correct, always gives 'ParentClass'. 
            // Also very round-about and likely slow.
            $trace = debug_backtrace();
            $class = $trace[0]['class'];
    
            return $class;
        }
    }
    
    class ChildClass1 extends ParentClass {
    
    }
    
    class ChildClass2 extends ParentClass {
    
    }
    
    // Shows 'ParentClass'
    // Want to show 'ChildClass1'
    print ChildClass1::whoAmI(); 
    print "\n";
    
    // Shows 'ParentClass'
    // Want to show 'ChildClass2'
    print ChildClass2::whoAmI();
    print "\n";
    
    5 回复  |  直到 16 年前
        2
  •  2
  •   S.Lott    16 年前

    someObject.whoAmI()

    if someObject.whoAmI() == 'ChildClass1' { do X(someObject) } X()

        3
  •  2
  •   Adam Franco    15 年前

    Late Static Binding static get_called_class()

    <?php
    
    abstract class ParentClass {
    
        public static function whoAmI () {
            return get_called_class();
        }
    
    }
    
    class ChildClass1 extends ParentClass {
    
    }
    
    class ChildClass2 extends ParentClass {
    
    }
    
    // Shows 'ChildClass1'
    print ChildClass1::whoAmI(); 
    print "\n";
    
    // Shows 'ChildClass2'
    print ChildClass2::whoAmI();
    print "\n";
    

    user contributed notes for get_called_class() debug_backtrace()

        4
  •  1
  •   genesis    13 年前
        5
  •  0
  •   Andrei Dziahel vjache    16 年前