コードで厳密に型指定されたパラメーターを使用する必要がある場合がありますが、PHP言語自体は厳密に型指定されていません(たとえば、enum-Enumなどのデータ型があるC#など)。 ただし、この状況から抜け出す方法はまだあります。 インターネットを介して大騒ぎして、私に適したソリューションが見つかりませんでした。 この問題に対する私の解決策を提供します。
問題は次のとおりでした。 入力として厳密に型指定されたオブジェクト(クラス)を受け入れる関数を実装する必要がありますが、関数の本体では、このクラスの値を列挙し、定義済みの定数(同じクラス)と比較する必要があります。
function test(Data $data) { switch ((string)$data) { case Data::ID: echo 'This is ID' . PHP_EOL; break; case Data::STRING: echo 'This is a STRING' . PHP_EOL; break; } }
ただし、PHPが
switch
パラメーターとしてオブジェクトを使用できないことを警告することがすぐに明らかになります。
この問題の解決策は、事前定義された定数が使用される抽象クラスをすべてのクラスの基本クラスとして実装し、
switch
で比較を行うことです。
このクラスのコード:
abstract class AbstractEnum { protected static $instance = null; protected static $value; protected final function __construct() { } protected final function __clone() { } protected final function __wakeup() { } public static function getInstance($value) { if (self::$instance === null) { self::$instance = new static(); } self::setConstant($value);
ここで、上記の抽象クラスを継承するクラスを実装します。 このクラスは、比較する定数を含むクラスです。
class Data extends AbstractEnum { const ID = 1;
次に、クラスの動作をチェックする関数を実装します。 主な問題は、私が言ったように、渡されるパラメーターの厳密な型指定でした。 型として、クラス
Data
を示します。
function test(Data $data) {
最後に、機能を確認します。
for ($i = 1; $i < 3; $i++) { test(Data::getInstance($i)); }
すべてが望みどおりに機能します。 以上です。 このデザインがお役に立てば幸いです。