-2

これは少し複雑になるかもしれないので、できるだけ簡単な方法で説明しようとします。などで定義されているいくつかのクラスを必要とする場合と必要としない場合があるコードの一部を保持するものを
検討してください。source.phpclass1.phpclass2.php

source.php - 典型的なオートローディング

// Simple autoloader, nothing fancy
spl_autoload_register(function ($class) {
        $requested_file = strtolower($class) . '.php';
        if (file_exists($requested_class)) {
                require_once($requested_class);
        } else {
            throw new Exception("Unable to load $class.");
        }
    });
...
$class1 = new Class1();
class1->doSomething();
...
$class8 = new Class8();
class8->doSomethingElse();

基本的に、オブジェクトのインスタンス化を省略して、次のようにオブジェクトをすぐに使用したいと考えています。

source.php - 達成したいこと

spl_autoload_register(function ($class) {
   ...
    });
...
$class1->doSomething();
...
$class8->doSomethingElse();

なぜ聞くの?さて、数か月前にシングルトン パターンを使用してカスタム CMS をプログラムし、すべてのクラスを静的として定義し、次のように使用しました。

source.php - 私が今やっていること

spl_autoload_register(function ($class) {
   ...
    });
...
Class1::doSomething();
...
Class8::doSomethingElse();

100 を超えるソース ファイルとクラス ファイルについて考えてみましょう。誰かがコメント セクションで指摘する前に、ここでいくつかのコメントに回答します。

  • そもそもなぜ静的クラスを使用したのですか? 当時、私はこの小さなトリックで要求されたクラスのみがロードされ、メモリと CPU の消費を大幅に節約できると考えていました。
  • では、なぜ静的クラスから切り替えたいのでしょうか? 私たちのプロジェクト マネージャーは、静的クラスとクラスの 1 つのインスタンス化に関するいくつかの記事を読み、パフォーマンスが大幅に向上するため、切り替える必要があると結論付けました (ただし、静的クラスの欠点は個人的に知っていますが、そうなるとは思いません)。著しい向上)。
  • 各クラス ファイルの最後でオブジェクトをインスタンス化するだけです。クラス ファイル内のインスタンス化されたオブジェクトはまだソース ファイル内で認識できないため、これは役に立ちません。
  • クラスを初めて使用した場所を見つけて、そこでオブジェクトをインスタンス化します。このソース ファイルは、他の開発者によって特定の方法で相互に含まれているため、実行できません。つまりsource1.phpsource2.php両方とも含まれてsource3.phpおり、同じクラスを使用しています。
  • 何を提案しますか? オブジェクトとして使用される未定義の変数 (spl_autoload_register など) に遭遇したときに php をキャッチし、それに応じて要求されたクラスをロードする方法はありますか?

TL;DR

そのクラスのインスタンスが使用されているときにクラスを動的にオートロードする方法、つまり、すべてのクラスをやみくもに含めるのではなく、要求されたクラスのみを含めることを意味しますか?

4

1 に答える 1