PHP中的抽象trait't方法不允许是静态的?

Vla*_*Ria 5 php oop traits

这是我的例子:

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
}
Run Code Online (Sandbox Code Playgroud)

类:

class AppConfig {
    use FileConfig;

    public static function getPaths() {
        return array(...);  
    }
}
Run Code Online (Sandbox Code Playgroud)

呼叫:

AppConfig::getPathForUploads();
Run Code Online (Sandbox Code Playgroud)

将它设置为静态和抽象(使用FileConfig强制类来实现getPaths)是必要的.

我想知道如何实现改变它的静态属性的方法?这是一个好习惯还是有更好的解决方案?有一天会变成非法吗?

谢谢

use*_*317 8

这是在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();
Run Code Online (Sandbox Code Playgroud)

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

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