接口常量,后期静态绑定

Interface constants, Late Static Bindings

interface PasswordBrokerContract
{
    const PASSWORD_RESET = 'passwords.reset';

    public function reset(array $credentials, Closure $callback);
}

class PasswordBroker implements PasswordBrokerContract
{
    public function reset(array $credentials, Closure $callback)
    {
        // implementation

        return static::PASSWORD_RESET;
    }

}

考虑到接口常量不能被继承它们的 class/interface 覆盖,使用 selfstatic 是否重要?

这可能很重要,因为即使您无法在实现接口的 classes 中覆盖接口常量,您也可以在 classes extending原来实现接口的class:

例如以下:

<?php

interface Contract
{
    const PASSWORD_RESET = 'passwords.reset';
    public function reset(): void;
}


class A implements Contract
{
    public function reset(): void
    {
        echo static::PASSWORD_RESET, "\n";
    }
}

class B extends A {
    const PASSWORD_RESET = 'foobar';
}

现在这个:

(new A())->reset();

会输出 passwords.reset.

但是这个:

(new B())->reset();

会输出 foobar.

但是如果你不使用后期静态绑定,而是使用 self,你每次都会得到 passwords.reset

看到它工作 here