1

これは2つの部分からなる質問ですが、両方の部分は密接に関連しています。

Webサイト用のページデコレータAPIを作成し、デコレータクラスのオートローダーをサイト全体のインクルードファイルに配置しました。別の開発者は、オートローダーをどこでも使用することは非常に危険であり、奇妙なエラーを引き起こす可能性があるため、これは非常に悪い考えだと考えました。たとえば、オブジェクトをセッションにシリアル化し、自動ロードされたクラスの1つが同じ名前とを持っている場合、そのオブジェクトは__wakeup()実行されます(これを試しましたが、再現できませんでした)。自動読み込みが危険であるというのは本当ですか?もしそうなら、それはどのような潜在的な危険を持っており、それらをどのように回避することができますか?私はを使用していませんが、を使用し__autoload()た自動ロード関数を使用していspl_autoload_register()ます。

自動ロードの使用に対して彼が持っていたもう1つの議論は、ファイルを直接含めるよりも遅いということです。これはおそらく非常に明白です。デコレータが各ページで機能することが保証されるためには、すべてのデコレータクラスを含める必要があると主張したので、彼の提案は、インクルードを取得して必要なクラスを作成するファクトリクラスを作成することでした。何度も続けることはできますが、多くの人が自動読み込みのメリットを宣伝し、どのアプリケーションも高速になると言っているのを聞いています。私はそれがとても好きですが、それでも私は最善かつ最速のことをしたいと思っています。助言がありますか?

4

2 に答える 2

6

たとえば、オブジェクトをセッションにシリアル化し、自動ロードされたクラスの1つが同じ名前と__wakeup()を持っている場合、そのオブジェクトは実行されます(これを試しましたが、再現できませんでした)。

ある意味、それは本当です。まったく同じ名前の2つのファイルに2つのクラスがある場合、オートローダーはどちらが必要かを推測できないため、間違ったクラスになってしまう可能性があります。これに対する最も簡単な修正は、名前空間を使用することです。

自動ロードの使用に対して彼が持っていたもう1つの議論は、ファイルを直接含めるよりも遅いということです。これはおそらく非常に明白です。

これもある意味で真実です。自動読み込みは直接インクルードよりも低速ですが、はるかに使いやすく、インクルードする必要のないファイルをインクルードしないように注意してください。その最後の部分は、それを引き分けにするか、おそらくさらに速くするかもしれません。

デコレータが各ページで機能することが保証されるためには、すべてのデコレータクラスを含める必要があると主張したので、彼の提案は、インクルードを取得して必要なクラスを作成するファクトリクラスを作成することでした。

これは、PHPがネイティブに実行できることにとって非常に多くの作業です。注意:PHPで自作のファクトリを使用してロードするクラスを決定している場合、実際にはオートローダーを構築していますが、それを呼び出しているわけではありません;)

助言がありますか?

個人的には、ファイルを手動で含めたくありません。spl_autoload_register機能を使い始めてから久しぶりですが、少し後悔はしていません。

于 2011-03-04T08:17:41.117 に答える
1

オートローダーを使用しないことで、物事がより困難になり、読みやすさが失われると思います。

PHPの名前空間についてはあまり詳しくありませんが、主要なフレームワークのほとんどとPEARライブラリが自動読み込みを使用していることを確認してください。

その場所に基づいてクラスに名前を付け、それを使用してファイルをロードすると、非常に簡単になります。

つまり、My_Special_Modelというクラスがあります。オートローダーが呼び出され、my/specialディレクトリにファイルmodel.phpが含まれます。

オートローダーを使用した場合のパフォーマンスに関する限り、パフォーマンスの問題が発生するまで心配する必要はありません。自動読み込みを削除するよりも、単一のクエリを最適化できる可能性がはるかに高くなります。

于 2011-03-04T08:23:45.933 に答える