抽象特征方法不允许在 PHP 中是静态的


Abstract trait't method not allowed to be static in PHP?

这是我的例子:

trait FileConfig {
    public static function getPathForUploads() {
        $paths = static::getPaths();
        //etc.
    }
    abstract public static function getPaths(); //doesn't work. Error: "Static function SharedDefaultConfig::getPaths() should not be abstract"
    abstract public function getPaths(); //OK
    public static function getPaths() {} //OK
}

类:

class AppConfig {
    use FileConfig;
    public static function getPaths() {
        return array(...);  
    }
}

叫:

AppConfig::getPathForUploads();

使它静态和抽象(强制类使用 FileConfig 实现 getPaths)是必要的。

我想知道如何实现方法更改其静态属性?这是一种好的做法还是有更好的解决方案?有一天会成为非法的吗?

谢谢

这在 php 7 中是固定的,因此以下代码有效:

<?php
error_reporting(-1);
trait FileConfig {
    public static function getPathForUploads() {
        echo static::getPaths();
    }
    abstract static function getPaths();
}
class AppConfig {
    use FileConfig;
    protected static function getPaths() {
        return "hello world";
    }
}
AppConfig::getPathForUploads();

http://sandbox.onlinephpfunctions.com/code/610f3140b056f3c3e8defb84e6b57ae61fbafbc9

但它实际上并没有在编译期间检查 AppConfig 中的方法是否是静态的。仅当您尝试静态调用非静态方法时,才会收到警告:http://sandbox.onlinephpfunctions.com/code/1252f81af34f71e901994af2531104d70024a685

不需要将方法设为静态,即可强制类使用它来实现该方法。您可以简单地同时使用接口。

trait FileUploadConfig {
    public static function getPathForUploads() {
        $paths = static::getPaths();
        //etc.
    }
}

特质保持原样。我只是拿走了界面的功能。

interface PathConfiguration {
    public static function getPaths();
}

接口强制类实现函数。我把static留在那里,以符合特征的规范。

class AppConfig implements PathConfiguration {
    use FileUploadConfig;
    public static function getPaths() {
        return [];
    }
}

要强制类使用 FileConfig 实现 getPaths,将抽象函数设为静态函数是不必要的。静态意味着它属于声明它的类。使其受静态保护,从 trait 添加代码,然后您可以通过从 AppConfig 类继承来更改行为。