Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 有没有办法在静态方法中检测目标类?_Php_Oop_Php 5.3_Php 5.2 - Fatal编程技术网

Php 有没有办法在静态方法中检测目标类?

Php 有没有办法在静态方法中检测目标类?,php,oop,php-5.3,php-5.2,Php,Oop,Php 5.3,Php 5.2,下面是一个示例类层次结构和代码。我要寻找的是一种方法来确定“ChildClass1”或“ChildClass2”是否调用了静态方法whoAmI,而无需在每个子类中重新实现它 <?php abstract class ParentClass { public static function whoAmI () { // NOT correct, always gives 'ParentClass' $class = __CLASS__;

下面是一个示例类层次结构和代码。我要寻找的是一种方法来确定“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";

我相信您所指的是一个已知的php错误。PHP5.3旨在通过一个新的后期静态绑定特性来解决这个问题


我相信您所指的是一个已知的php错误。PHP5.3旨在通过一个新的后期静态绑定特性来解决这个问题


否。请等待PHP5.3。

否。请等待PHP5.3。

类标识通常是未充分理解多态性的症状

ChildClass1和ChildClass2的客户端不需要区分它们

任何一个类都不应该在任何地方询问关于某个Object.whoAmI的问题

无论何时,当您有编写if someObject.whoAmI=='ChildClass1'{do XsomeObject}的冲动时,您都应该向父类添加一个X方法,并在不同的子类中使用不同的实现


这种运行时类型标识几乎总是可以用正确的多态类设计来代替。

类标识通常是多态性未得到充分理解的症状

ChildClass1和ChildClass2的客户端不需要区分它们

任何一个类都不应该在任何地方询问关于某个Object.whoAmI的问题

无论何时,当您有编写if someObject.whoAmI=='ChildClass1'{do XsomeObject}的冲动时,您都应该向父类添加一个X方法,并在不同的子类中使用不同的实现


这种运行时类型标识几乎总是可以用适当的多态类设计来代替。

从PHP5.3开始,可以使用,但目前不可能。

从PHP5.3开始,可以使用,但是现在这是不可能的。

既然PHP5.3在野外广泛使用,我想总结一下这个问题的答案,以反映新的可用技术

正如其他答案中提到的,PHP5.3通过一个新的关键字引入了。此外,还提供了一个新函数,该函数只能在类方法实例或静态中使用

为了确定本问题中提出的类,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";

其中包括一些示例实现,通过使用debug_backtrace也可以在PHP5.2中工作。

既然PHP5.3在野外广泛可用,我想总结一下这个问题的答案,以反映新的可用技术

正如其他答案中提到的,PHP5.3通过一个新的关键字引入了。此外,还提供了一个新函数,该函数只能在类方法实例或静态中使用

为了确定本问题中提出的类,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";

其中包括一些通过使用debug_backtrace也可以在PHP5.2中工作的示例实现。

@S.Lott我完全同意,如果在实际代码中使用这种方法,它将是一个泄漏的抽象。在这种情况下,该方法只是提供一个可理解的示例。我想要确定子类的原因是,我可以使用由类层次结构的所有成员共享的静态实例创建方法,但仍然调用适当的child-constructor.@S.Lott我完全同意,如果在实际代码中使用这种方法,将是一个泄漏的抽象。在这种情况下,该方法只是提供一个可理解的示例。我想要确定子类的原因是,我可以使用由类层次结构的所有成员共享的静态实例创建方法,但仍然可以调用相应的子构造函数。