2
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;
    }

}

如果您使用selfstatic考虑接口常量不能被继承它们的类/接口覆盖,这有关系吗?

4

1 回答 1

2

这可能很重要,因为即使您不能在实现接口的类中覆盖接口常量,您也可以在扩展最初实现接口的类的类中覆盖这些常量:

例如以下:

<?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每次都会得到。

看到它在这里工作。

于 2019-11-27T10:00:18.957 回答