Php 当使用“自过静态”时

Php 当使用“自过静态”时,php,Php,从5.3版开始,PHP已经实现了,可以在静态继承的上下文中引用被调用的类 通常,在很多上下文中,static::似乎比self::更有用,主要是在您希望能够扩展类和方法的情况下。从类调用方法(如self::someMethod())似乎没有意义,因为如果扩展该类并重写该方法,可能会导致不可靠的行为 例如(): class ParentClass { public static function someMethod () { return 'ParentClass::some

从5.3版开始,PHP已经实现了,可以在静态继承的上下文中引用被调用的类

通常,在很多上下文中,
static::
似乎比
self::
更有用,主要是在您希望能够扩展类和方法的情况下。从类调用方法(如
self::someMethod()
)似乎没有意义,因为如果扩展该类并重写该方法,可能会导致不可靠的行为

例如():

class ParentClass {
    public static function someMethod ()       { return 'ParentClass::someMethod()'; }
    public static function getSomeMethodData() { return self::someMethod(); }
}

class ChildClass extends ParentClass {
    public static function someMethod ()       { return 'ChildClass::someMethod()'; }
}

ChildClass::getSomeMethodData();
// Return -> "ParentClass::getSomeMethodData()"
// Not    -> "ChildClass ::getSomeMethodData()"
如果将
self::
替换为
static::
,则可以更改此行为

好的,在blábláblá之后,我的问题是:在某些上下文中,我们应该使用
self:
而不是
static::
作为方法或属性

我的意思是,我可以用
静态::
替换所有
self::
而不使用它来更改我所有代码库的代码行为吗


编辑#1:使其更清晰。在这种情况下,我必须使用
self::
而不是
static::
?我的意思是,在哪种情况下,不可避免地使用
self::
?例如,我可以考虑<代码>自我::类< /代码>,但是它可以被替换为<代码>第二类> /代码>(尽管我还是更喜欢<代码>::类< /代码>版本)。

在自我和静态之间有区别。如果使用static调用该方法,它将在该方法实际所在的类的上下文中运行

自我和静态之间存在差异。如果使用static调用该方法,它将在该方法实际所在的类的上下文中运行

您可以在需要的地方使用
self::
,在需要的地方使用
static::
。除了你,没有人能说什么适合你的代码库。谢谢你的回复,但这不是我的疑问。问题是:在哪种情况下,我必须使用
self::
而不是
static::
。我的意思是,在哪种情况下使用
self::
?例如,我可以考虑<代码>::类< /代码>,但它可以被<代码> >类> <代码>(尽管我更喜欢<代码>:::类< /代码>版本)。你明白两者之间的区别,去运用这种理解。你不需要这里的人提供流程图来做决定。澄清一下:没有任何地方你必须使用
self::
static::
或类,甚至PHP。这是一种图灵完整语言,可以随意与其他语言交换。“我是否可以将所有
self::
替换为
static::
而不更改我所有代码库的代码行为?”-这取决于代码,这里没有人可以为您回答这个问题。如果你可以在不改变行为的情况下在任意代码库中盲目地替换它,那么它们就不需要两者,因为它们必须做完全相同的事情。这不是一个有效的响应。例如,我可以将
intval()
替换为
(int)
替换为我所有的代码库吗?答案是肯定的。因为它无论如何都不会影响行为。我在这里的怀疑不是关于一个特定的代码库。我正在检查插件,我想建议用户将
self::
替换为
static::
替换为任何情况(应用
final
修饰符时除外),以实现类的可扩展性(尊重OCP-打开/关闭原则)。您可以在需要的地方使用
self::
,在需要的地方使用
static::
。除了你,没有人能说什么适合你的代码库。谢谢你的回复,但这不是我的疑问。问题是:在哪种情况下,我必须使用
self::
而不是
static::
。我的意思是,在哪种情况下使用
self::
?例如,我可以考虑<代码>::类< /代码>,但它可以被<代码> >类> <代码>(尽管我更喜欢<代码>:::类< /代码>版本)。你明白两者之间的区别,去运用这种理解。你不需要这里的人提供流程图来做决定。澄清一下:没有任何地方你必须使用
self::
static::
或类,甚至PHP。这是一种图灵完整语言,可以随意与其他语言交换。“我是否可以将所有
self::
替换为
static::
而不更改我所有代码库的代码行为?”-这取决于代码,这里没有人可以为您回答这个问题。如果你可以在不改变行为的情况下在任意代码库中盲目地替换它,那么它们就不需要两者,因为它们必须做完全相同的事情。这不是一个有效的响应。例如,我可以将
intval()
替换为
(int)
替换为我所有的代码库吗?答案是肯定的。因为它无论如何都不会影响行为。我在这里的怀疑不是关于一个特定的代码库。我正在检查插件,我想建议用户将
self::
替换为
static::
替换为任何情况(应用
final
修饰符时除外),以实现类的可扩展性(尊重OCP-打开/关闭原则)。谢谢您的回答,但问题不是这样。阅读。谢谢你的回复,但问题不是这样。阅读