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
我有一个带有静态函数的基 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