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

时间:2015-01-13 13:02:45

标签: 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
}

类别:

class AppConfig {
    use FileConfig;

    public static function getPaths() {
        return array(...);  
    }
}

呼叫:

AppConfig::getPathForUploads();

有必要将其设置为静态和抽象(使用 FileConfig 强制类来实现 getPaths )。

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

谢谢

3 个答案:

答案 0 :(得分:7)

这已在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

答案 1 :(得分:3)

您不需要使方法静态以强制使用它来实现该方法。您可以简单地使用interfaces

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 [];
    }
}

答案 2 :(得分:2)

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