我在这篇文章中发现@WebSmithery用户使用一个聪明的'hack‘来解决这个问题。PHP中的抽象常量-强制子类定义常量
在那篇文章中,@WebSmithery发布了一个有用的例子。见下文:
<?php
abstract class Foo {
// Self-referential 'abstract' declaration
const NAME = self::NAME;
}
class Fooling extends Foo {
// Overrides definition from parent class
// Without this declaration, an error will be triggered
const NAME = 'Donald';
}
$fooling = new Fooling();
echo $fooling::NAME;虽然上面的例子很好,但我确实发现了一个问题。如果抽象类有访问const (本例中的名称)本身的代码,那么这个'hack‘就会失败。下面是一个例子。当我运行它时,它会抛出此错误“无法声明自引用常量”。想知道有没有办法绕过这件事吗?
<?php
abstract class Foo
{
// Self-referential 'abstract' declaration
const NAME = self::NAME;
public function echoNAME()
{
echo Foo::NAME;
}
}
class Fooling extends Foo
{
// Overrides definition from parent class
// Without this declaration, an error will be triggered
const NAME = 'Donald';
}
$fooling = new Fooling();
$fooling->echoNAME();发布于 2022-08-01 22:26:06
如果要引用子类的静态成员,则需要使用后期静态绑定。
因此,您可以使用Foo:NAME而不是static::NAME。
<?php
abstract class Foo
{
// Self-referential 'abstract' declaration
const NAME = self::NAME;
public function echoNAME()
{
echo static::NAME;
}
}
class Fooling extends Foo
{
// Overrides definition from parent class
// Without this declaration, an error will be triggered
const NAME = 'Donald';
}
$fooling = new Fooling();
$fooling->echoNAME();
echo PHP_EOL;https://stackoverflow.com/questions/73199358
复制相似问题