С поздней статической привязкой в PHP v5.3 можно с пользой объявить методы static
в интерфейсах; с чертами PHP v5.4, методы могут быть либо static
, либо abstract
, но не оба. Это кажется нелогичным и непоследовательным.
В частности, предположим, что у одного есть интерфейс, для которого признак обеспечивает всю реализацию, за исключением статического метода; если этот признак не указан в этом признаке, статические анализаторы не могут ссылаться на какие-либо ссылки на них в пределах этого признака. Но предоставление конкретной реализации в этом признаке больше не приводит к внедрению/использованию классов для обеспечения их собственной реализации - что опасно; abstract static
был бы идеальным, но не разрешен.
Каково объяснение этого противоречия? Как вы порекомендовали бы разрешить эту проблему?
interface MyInterface
{
public static function getSetting();
public function doSomethingWithSetting();
}
trait MyTrait
{
public abstract static function getSetting(); // I want this...
public function doSomethingWithSetting() {
$setting = static::getSetting(); // ...so that I can do this
/* ... */
}
}
class MyClass implements MyInterface
{
use MyTrait;
public static function getSetting() { return /* ... */ }
}