PHP 8.1 関数 (カテゴリ名など) を使用して名前空間のエイリアスを作成できますか?
Company のデフォルトの名前空間モジュールに「Subcompany」という名前を付けましたが、用途が拡大したため、これを「Company」にしたいと考えています。
完璧な答えは、オーバーヘッドをできる限り少なくし、透過的な自動読み込みを可能にすることです。 1 つの問題は、Intelephense のようなツールがこのエイリアスを理解することです。
このプロジェクトでは Composer も使用しているため、Composer を使用して名前空間を書き換えるという答えも機能します。
はい、そう考えてください:
class_alias
は、新しい名前空間言語機能を備えた PHP 5.3 で導入されました。これは、グローバル名前空間から名前空間への移行を容易にするために作成されました。実際、 は名前空間の間にあります。ただし、最初に、古いクラス/インターフェイス/特性/列挙のそれぞれのカテゴリ名を新しい対応物に登録する必要があります。
リーリー古いライブラリは消滅し、現在は新しい Tiger ライブラリが存在します。すべてのクラスなどは、名前空間プレフィックスを交換することでマッピングできます (
'My\Old\Lib\Name\' -> 'My\Tiger\Lib\Name'
)。PHP がほとんどの作業を行うため、これは実行時に行うことができます。
古い名前空間プレフィックスに基づいて新しい名前空間プレフィックスをロードし、カテゴリ名に古い名前をプレフィックスとして付けるオートローダーを登録します。
###例:### リーリーこのコードは非常に単純で、登録パラメータに関する 2 つの説明だけです:
$throw = true- : エイリアス オートローダーの登録に失敗したときにアプリケーションをすぐに停止する必要があります。そうしないと、ずっと後になって奇妙な「クラスが見つかりません」というエラーが表示されます。
$prepend = false- : コールバックは、古いクラス名を使用するコードがまだ存在する場合にのみ呼び出される必要があります。したがって、標準コードは、新しい名前空間と標準の自動読み込みを使用して最初に来るようになりました。
おそらく注目に値するのは、
class_exists()の部分です:
リーリー
新しいクラスがまだロードされていない場合は、自動ロードがトリガーされます。オートローダーを登録した後、古いコードは古いエイリアスの下で新しいクラスを自動的にロードします。
リーリー完全な例- (3v4l.org)。