1. ホーム
  2. php

PHP traits - 汎用定数の定義

2023-10-06 10:37:30

質問

名前空間内の多くのクラスで使用される可能性のある定数を定義するための最良の方法は何でしょうか?私はあまり多くの継承を避けようとしているので、基底クラスを拡張することは理想的な解決策ではありません。PHP 5.4でこれはどうにか可能なのでしょうか、それとも別のアプローチを取るべきなのでしょうか?

私は次のような状況です。

trait Base
{
    // Generic functions
}

class A 
{
    use Base;
}

class B 
{
    use Base;
}

問題は、PHPのtraitで定数を定義することができないことです。理想を言えば、以下のようなものが欲しいところです。

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

    // Generic functions
}

そして、これらは、特質を適用するクラスからアクセスすることができます。

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

しかし、traitの制限のため、これは不可能です。何かアイデアはありませんか?

どのように解決するのですか?

結局 ユーザセクタスの提案 を使うことにしました。これは、これを扱うのに最も問題の少ない方法のように感じられます。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;