2

その場で関数をインポートするための最良の実用的なアプローチを見つけようとしています...説明させてください。

次のファイルを含むfunctionsというディレクトリがあるとします。

array_select.func.php
stat_mediam.func.php
stat_mean.func.php
.....

私がしたいのは、個々のファイル(内部に関数が定義されている)をロードし、内部php関数のように使用する.. array_pop()、array_shift()など.

PHPインストールの一部としてユーザー定義関数をコンパイルしたチュートリアル(今では再び見つけることができません)に出くわしたことがあります.共有/リセラーホスティングではPHPインストールを再コンパイルできないため、これはあまり良い解決策ではありません.

PHP の将来のバージョンや他の拡張機能と競合したくありません。つまり、私が X と名付けた関数が突然内部の php 関数の一部になった場合 (それ自体は同じ機能を持っていないかもしれませんが)、私はしません。これが原因で PHP が致命的なエラーをスローして惨めに失敗するのは望ましくありません。

したがって、私が考えることができる最善の方法は、function_exists() を使用して関数が定義されているかどうかを確認することです。ただし、それはおそらく、そのような関数が必要な他のファイルに多くの include/require ステートメントがあることに変換されますが、これはあまり好きではありません。または、ディレクトリを読み取り、各 *.func.php ファイルと include_once をループします。私はこれが少し醜いと思いますが。

問題は、そのようなケースを処理するソース コードに出くわしたことがありますか? どのように実装されましたか?似たようなことをしたことがありますか?できるだけ多くのアイデアが必要です!:)

4

3 に答える 3

4

このようなものを実現する 1 つの方法は、これらの関数をクラスに配置してから、__autoload関数をセットアップすることです。関数をクラスにラップすることに反対している場合、この解決策はおそらく適用されません。個人的には、関数に名前を付けて、関数間でプライベート メソッドを共有できるので気に入っています。

最初に、これと同様のオートロード機能をセットアップします。独自のスタイルに合うように命名規則を調整し、おそらくエラー処理を導入する必要がありますが、これは基本的な考え方を理解するためのものです。

function __autoload($class_name){
     require_once(strtolower("library/$class_name.class.php"));
}

次に、スコープに関係なく、コードのどこでもこのようなことができます。

arrayFunctions::doStuff($myArray);

PHP は自動的に "library/arrayFunctions.class.php" をインクルードしようとし、arrayFunctions クラスで "doStuff" と呼ばれるメソッドを探します。

于 2010-03-16T20:13:02.337 に答える
0
  1. 必要に応じて自動的にロードするには、関数をクラスに入れ、オートロードを使用します。
  2. 名前の競合については、名前空間を使用します (PHP 5.3 を使用している場合)。
于 2010-03-16T20:31:08.457 に答える
0

私はこの考えに問題があります。1 つの関数を含めるためにファイル システムをヒットすると、1 秒あたりの最大リクエスト数が減少するという点で非常にコストがかかります。

一般に、2 つの関数に対して 2 つのファイルをロードする (2 つの stat 呼び出し) よりも、1 つのファイル (静的クラス?) に 5 つの関数をロード/解析し、そのうちの 2 つだけを使用する (1 つの stat 呼び出し) 方がはるかに優れています。

5 つの機能すべてが必要な場合、これは明らかにさらに悪化します。

于 2010-03-16T20:29:21.453 に答える