4

私のアプリケーションは、リクエストをフェッチする前に、require_once を使用して、いくつかの関連クラスを含む一連のファイル (ライブラリと言うのを躊躇します) を取得する「中央」ページ コントローラーを使用します。次のように:

require_once (dir_lib . 'db.php');              
require_once (dir_lib . 'uuid.php');            
require_once (dir_lib . 'data.php');            
require_once (dir_lib . 'token.php');           
require_once (dir_lib . 'logs.php');            
require_once (dir_lib . 'time.php');

等...

最近、(素晴らしいが巨大な) 'HTML Purifier' ライブラリをインストールし、そのオートローダーをちらりと見るまで、わざわざメモリ使用量をチェックしていませんでした。どうやら、オートローダがオンになっていないため、各スクリプト インスタンスのメモリ使用量は 5,376 キロバイトにもなります。(それが最終的な結果である場合、組み込みのオートローダーが何のためにあるのかはわかりませんが、余談です) HTML Purifier がなければ、ほとんどのインスタンスは依然として 1 メガバイト以上の重量があります。

PHP オートロード関数について読んでいると、オートローダーは厳密に OOP 向けに設計されているという印象を受けます。purifier ライブラリを除いて、オブジェクト指向のコードはほとんど使用していません。概念を誤解しているだけですか?各リクエストに不要なクラスの束をやみくもにロードすることを避けるための他の実用的な方法はありますか? それらをすべて事前に含めようとするのが面倒なだけですか?

編集 -

ここでこのコメントを繰り返して、非 oo の意味を明確にします。それが大きな違いを生む場合:

私は基本的に、実際の OOP を (ほとんど) 使用せずに、名前空間の代わりにクラスを使用しています。つまり、「DBFunctions」クラスには、たとえば関数「execute」と「getRow」が含まれる場合があります。関数は、「dbFunctions::execute($sql)」などの静的メソッド呼び出しで呼び出されます。

4

3 に答える 3

1

Autoload を使用しても、クラス自体は呼び出されるか使用されるまでロードされないため、パフォーマンスが低下することはありません。Autoload コンストラクトは基本的に、クラスがまだインスタンス化されていない場合に必要に応じてクラスをロードします。

クラスが最初にインスタンス化されているコードを見つけます。クラス ファイルが自動的にインスタンス化されない限り、メモリを必要としません。すべてがインスタンス化されているわけではありませんが、必要がない場合は設定解除されません。

それぞれがインスタンス化されている場所、または問題のものが見つかったら、次を使用できます。

//Gets the object name using the class.
echo get_class($classinstance) , "\n";

を使用して、いくつかのブレークポイントを配置することで処理できますmemory_get_peak_usage()

//Output memory usage at start of class instanciation.
echo memory_get_usage()
#memory_get_peak_usage() prior to 5.2.1.

$classobject1 = new theclass();

//Output memory usage after class instanciation.
echo memory_get_usage()

同じことを試してみますが、今回はクラスが使用された後に unset() を使用します。

//Output memory usage at start of class instanciation.
echo memory_get_usage()
#memory_get_peak_usage() prior to 5.2.1.

$classobject1 = new theclass();

unset($classobject1);

//Output memory usage after class instanciation.
echo memory_get_usage()

したがって、基本的には、アプリ全体で未使用のインスタンスを設定解除し、大きなオブジェクトを見つけてデバッグします。

これは、OOP に関する @greg のコメントを明確にするためのものです。

このチャンクをサンプルとして取得します。

class Tun{
    private $run = 'i\'m running';

    function run(){
        echo $this->run;
    }
}

echo Tun::run;

出力:

Error: Fatal error: Undefined class constant 'run' in C:\Work\pro\debug.php on line 16

上記のサンプルは、OOP を使用する関数 (この場合はクラスのプライベート変数) を参照しているためです$run。クラスはインスタンス化されていない (オブジェクト インスタンス) ため、エラーが発生します。したがって、はい、参照によってクラス内で関数を使用できますが、ほとんどの場合、単純な手続き型または定数参照である必要があります。

この助けを願っています。

于 2010-08-17T11:54:45.133 に答える
1

PHP5 の autoload は、オンザフライでクラスをロードするためだけのものです。アプリケーションで使用できる autoload 関数は 1 つだけです (ただし、以下を参照してください)。詳細については、オートロードのドキュメントを参照してください。基本的に、PHPがまだロードされていないクラスを呼び出そうとしたときに、必要なクラスを含む、必要なファイルをロードする(または、さらに言えば、必要なことを何でも行う)__autoload()関数を定義できます。

質問で提供したリンクは、標準 PHP ライブラリの autoload に関するもので、これは異なり、より柔軟です。spl_autoload_register() を使用すると、オートロード関数を 1 つだけではなくスタックとして登録できます。これは、オートロードを利用するコードでライブラリを使用している場合に最も便利です。オートロードは、自分のライブラリや他のライブラリのオートロードを壊す必要がないからです。

小さなプロジェクトで OO を始めたばかりの場合は、おそらく __autoload() が必要なだけですが、spl_autoload を使用する HTMLPurifier のようなライブラリを統合したい場合は、ドキュメントの spl_autoload をグーグルで検索すると、それらが最初の結果になります。

于 2010-08-18T00:01:45.513 に答える
1

これらの関数ファイルがクラスではない特定の理由はありますか? 私が考えることができる唯一のものはPHP4の互換性ですが、オートロードはとにかくPHP4には存在しません。

これらの既存のコード ファイルをラップし、一致するようにclass DBFunctions { ... }関数呼び出しの前に を付けるDBFunctions::だけで、(spl_autoload_register() コールバックを適切に設定した後) オートローダーを動作させるのに十分であり、それだけの価値があります。コードをそのように維持したい場合は、スタイル的に手続き型であり、そのようにしたい場合は、コードベース全体を OOP 化するための適切なステップです。

(そして、HTML Purifier は象です。PHP の内部フィルター関数を調べましたか?)

于 2010-08-18T00:41:19.037 に答える