PHP: 在静态函数中获取派生的 class 上下文?即 BaseClass::staticBaseFunc() 与 DerivedClass::staticBaseFunc() 之间的区别

PHP: get derived class context in static function? i.e. differ between BaseClass::staticBaseFunc() vs DerivedClass::staticBaseFunc()

我有一个带有静态函数的基 class。但我想有一种方法可以知道我在其上下文中调用静态函数的实际 class(可能是基础 class 或派生的 class)。

例如:

<?php

class Foo
{
    static function Test() 
    { 
        $c = self::class;
        echo "Hello, I am creating a new instance of type $c";
        return new $c;
    }
}

class Bar extends Foo 
{
    public $someProperty;
}

$b = Bar::Test(); // This should do something different than Foo::Test();

?>

请注意,Test() 函数中的 self::class 始终会导致 'Foo',即使我使用 Bar:: 上下文调用它也是如此。

我知道我可以重写 Bar 中的 Test() 函数,但这不是我想要的,我想在基础 Test() 函数中保留已实现的功能。但只是使用我调用它的实际静态 class 上下文。

上面的Test()函数有没有办法说"I am creating a new instance of type Bar"和return一个Bar实例,而不是Foo

让我向您介绍后期静态绑定。

考虑以下代码,它与您的不完全相同,但它突出显示了我认为您面临的问题。

<?php

class A 
{

    public static $string = 'I am from class A';

    public static function getString()
    {
        return self::$string;
    }
}

class B extends A
{
    public static $string = 'I am from class B';
}

B::getString(); // returns 'I am from class A' ???!
?>

为了解决这个问题,您可以使用后期静态绑定在 运行 时间上下文(而不是编译时间上下文)使用变量

<?php

class A 
{

    public static $string = 'I am from class A';

    public static function getString()
    {
        return static::$string; // note the change here
    }
}

class B extends A
{
    public static $string = 'I am from class B';
}

B::getString(); // returns 'I am from class B' and all is well 
?>

这里提供的信息比我能提供的要多得多:https://www.php.net/manual/en/language.oop5.late-static-bindings.php