接口常量,后期静态绑定
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 覆盖,使用 self
或 static
是否重要?
这可能很重要,因为即使您无法在实现接口的 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。
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 覆盖,使用 self
或 static
是否重要?
这可能很重要,因为即使您无法在实现接口的 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。