PHP 特征 - 定义泛型常量

2022-08-30 08:37:41

定义命名空间中的许多类可以使用的常量的最佳方法是什么?我试图避免太多的继承,所以扩展基类不是一个理想的解决方案,我正在努力找到一个使用特征的良好解决方案。这在 PHP 5.4 中是否可能,或者是否应该采取不同的方法?

我有以下情况:

trait Base
{
    // Generic functions
}

class A 
{
    use Base;
}

class B 
{
    use Base;
}

问题是不可能在PHP特征中定义常量。理想情况下,我想要类似这样的东西:

trait Base
{
    const SOME_CONST = 'someconst';
    const SOME_OTHER_CONST = 'someotherconst';

    // Generic functions
}

然后可以通过应用该特征的类访问这些:

echo A::SOME_CONST;
echo B::SOME_OTHER_CONST;

但由于特征的限制,这是不可能的。有什么想法吗?


答案 1

我最终使用了user sectus对界面的建议,因为它感觉像是处理这个问题的问题最少的方式。使用接口来存储常量而不是API合约有一种不好的感觉,所以也许这个问题更多的是关于OO设计而不是特征实现。

interface Definition
{
    const SOME_CONST = 'someconst';
    const SOME_OTHER_CONST = 'someotherconst';
}

trait Base
{
    // Generic functions
}

class A implements Definition
{
    use Base;
}

class B implements Definition
{
    use Base;
}

这允许:

A::SOME_CONST;
B::SOME_CONST;

答案 2

您还可以使用静态变量。它们可以在类或特质本身中使用。- 作为const的替代品,对我来说工作得很好。

trait myTrait {
    static $someVarA = "my specific content";
    static $someVarB = "my second specific content";
}

class myCustomClass {
    use myTrait;

    public function hello()
    {
        return self::$someVarA;
    }
}

推荐