首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用static::MY_CONST、self::MY_CONST和SomeClass::MY_CONST在PHP7中引用常量

使用static::MY_CONST、self::MY_CONST和SomeClass::MY_CONST在PHP7中引用常量
EN

Stack Overflow用户
提问于 2018-08-21 18:05:39
回答 2查看 630关注 0票数 5

我想一劳永逸地说清楚。

我很确定我知道什么时候使用self::MY_CONSTSomeClass::MY_CONST,但不清楚什么时候使用static::MY_CONST

您使用self::MY_CONST…

…当引用在称为的同一个类中定义的常量时。

示例:

代码语言:javascript
复制
class Foo 
{
    const MY_CONST = 123;

    public function example() 
    {
        echo self::MY_CONST;
    }
}

您使用AnotherClass::MY_CONST…

…当你引用一个在不同类中定义的常量,而不是你称之为的那个。

示例:

代码语言:javascript
复制
class Bar
{
    const MY_CONST = 123;
}

class Foo 
{
    public function example() 
    {
        echo Bar::MY_CONST;
    }
}

您使用static::MY_CONST…

…什么时候?我不知道。就引用常量而言,使用static对我来说毫无意义。请提供有效的理由或确认self::SomeClass::示例已足够。

编辑:我的问题不是重复的。我根本不问关于$this的问题。不要将此标记为副本。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-21 18:23:44

所谓的“后期静态绑定”(另请参阅What exactly are late static bindings in PHP?)需要static关键字。manual page on that topic不是最清楚的,但这句话很关键:

静态“后期绑定”来自这样一个事实:

::不会使用定义该方法的类来解析,而是使用运行时信息来计算。

实际上,static::类似于$this,因为它解析为运行代码的类,这个类可能是编写代码的类的子类。

让我们使用您的self::示例,并添加一个子类:

代码语言:javascript
复制
class Foo 
{
    const MY_CONST = 123;

    public function example() 
    {
        echo self::MY_CONST;
    }
}

class Bar extends Foo
{
    const MY_CONST = 456;
}

$bar = new Bar;
$bar->example();

这将输出123,因为定义中的self::总是引用Foo,无论您如何调用它。

但是,如果我们改为使用后期静态绑定:

代码语言:javascript
复制
class Foo 
{
    const MY_CONST = 123;

    public function example() 
    {
        echo static::MY_CONST;
    }
}

class Bar extends Foo
{
    const MY_CONST = 456;
}

$bar = new Bar;
$bar->example();

现在它将回显456,因为static::解析为我们在执行调用时实际使用的类,即Bar,而Bar::MY_CONST具有不同的值。

票数 4
EN

Stack Overflow用户

发布于 2018-08-21 18:20:29

这个例子将向你展示所有的区别:

代码语言:javascript
复制
<?php

class A
{
    const TEST = 'A';

    static function echoSelf()
    {
        echo self::TEST . PHP_EOL;
    }

    static function echoStatic()
    {
        echo static::TEST . PHP_EOL;
    }
}

class B extends A
{
    const TEST = 'B';
}

echo 'Using self:' .PHP_EOL;
A::echoSelf(); // A
B::echoSelf(); // A

echo 'Using static:' .PHP_EOL;
A::echoStatic(); // A
B::echoStatic(); // B

享受;)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51946275

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档