2

最近、OO を使用して PHP アプリケーションのモデル コードを書き直しています。クラスを完成させ、名前空間を含めました (Project\Level1\Level2 などの形式で)。これはビルド済みのアプリケーションであるため、多くのクラスがあります。クラスを簡単にロードできるように、オートローダーを使用しています。しかし、ここで厄介な問題が発生します。

アプリケーション全体におそらく 300 ページが散らばっており、そのすべてが最初に PHP ファイル (一種のブートストラップ スクリプト) を必要とします。そのブートストラップ ファイルには、オートローダー スクリプトが必要です。

これで、ほとんどのページで少なくとも 1 つ、おそらく多くのクラスが使用されます。ここには 2 つのオプションがあることがわかっています。

//either call the classes using qualified names
$person = new Project\Person;

//or include the "use" keyword on every page, so we can alias the classes for ease of use
use Project\Person as Person;
$person = new Person;

しかし面倒なことは、アプリケーションのすべてのページでこれを行う必要はありません。

require_once('../php/bootstrap.php');
use Project\Person\ as Person,
    Project\Address\ as Address,
    Project\Group\ as Group
    Project\CustomField\ as CustomField;
$person = new Person;
$address = new Address;

念のため、ブートストラップ ファイルにすべてのクラスの use キーワードを含めてみましたが、PHP のマニュアルによると、「インポート ルールはファイル単位であり、インクルード ファイルは親ファイルのインポート ルールを継承しないことを意味します。」

アプリケーションのすべてのページにこれらの広大な use ステートメントを含めることは、価値がある以上に手間がかかるように思えます。1 ページで 15 クラスを使用している場合はどうなるでしょうか。その場合、使用ステートメントは巨大になります。

私の質問はこれです:それは面倒すぎますか?名前空間の使用は正しいですか、それとも PHP ではそれほど役に立ちませんか? そして、私たちがやろうとしていることを知った今、私たちはそれを正しく行っていますか? 欠けているものはありますか?常に完全修飾名でクラスを呼び出す必要がありますか?

(これはstackoverflowに関する私の最初の質問です。今後、質問に対して何か違うことやより良いことをする必要がある場合はお知らせください)

4

2 に答える 2

1

通常の Zend Framework Autoloader を使用するのは、あなたが望む方法ではないかもしれませんが、Zend Loader はカスタム オートローダーをサポートしており、インラインまたは実行時に動的に指定された名前空間を尊重できます。あなたの場合、use Project\Person\ as Personすでに気づいたように、面倒になる可能性のある which を使用しています。

オートローダーで名前空間を使用すると、興味深い部分に到達するためだけに大きなパスを追加することなく、単純なパス トラバーサルを使用してクラスを編成する自動ロードを利用できます。

そのため、代わりにnew Corp_Assets_Generic_Person_Address、フォルダ構造を保持して を使用できますnew Namespace_Person_Address

名前空間は、クラス名の衝突を回避します。特に、多数の異なるライブラリから適切なクラスをロードする必要があるオートローダーを実装する大規模なアプリケーションでは。短いクラス名を使用すると、コードが読みやすくなりますが、保守が難しくなる可能性があります。ステートメントを追加するuseと、読みやすく、後で保守しやすくなりますが、作成とリファクタリングが面倒になります。オートローダーの予想される動作を文書化し、カスタム オートローダーを使用してより読みやすいクラス名を作成することをお勧めします。

于 2012-06-07T03:33:33.530 に答える
0

php.ini で、ファイルを prepend_file として追加します

于 2012-06-04T21:59:03.450 に答える