1

私は試します

function some_class($class) {
        require PATH.'test'.$class.'.php';
    }



function test_class($class) {
        require PATH.'some'.$class.'.php';
    }

    spl_autoload_register("test_class");
    spl_autoload_register("some_class");


    $tst = new SomeClass();

SomeClass クラスは "PATH/some/SomeClass.php" にありますが、spl_autoload_register は "test_class" 関数のみを呼び出し、"some_class" は呼び出しません。しかし、関数の位置を変更すると、新しい SomeClass が見つかります。

4

3 に答える 3

0

spl_autoload_register- 正確にはどういう意味ですか? 例の助けを借りてそれを理解しようとしましょう:

function Autoloader($className)
    {
        require_once $path.$className.'.php';
    }

    spl_autoload_register('Autoloader');

    $myObj = new MyClass();

ここでは、include または require ステートメントを指定せずに、「MyClass」という名前のクラスをインスタンス化しました。

かっこよくないですか?では、どのようにそれを行ったのでしょうか? 掘り下げましょう。

ここでは、spl_autoload_register() 関数で「Autoloader」という名前の関数を登録しています。「MyClass」をインスタンス化すると、クラス名 (MyClass) が PHP によって「spl_autoload_register()」に渡され、そこで登録された関数がパラメーターとして取得します。Autoloader 関数の定義には、そのクラス ファイルのパスが含まれています。

これは単に素晴らしいです!! いくつかのクラスがあり、それらのすべてが各ケースまたは各ページで使用されるわけではないという状況を考えてみてください。そのような場合、spl_autoload_register() は真の救世主となります。

インスタンス化するだけで、後は spl_autoload_register() が処理します。

関数を登録する代わりに、次のようにすることもできます。

spl_autoload_register(function ($class) {
    include 'classes/' . $class . '.class.php';
});

ただし、このコードのチャンクは PHP >= 5.3.0 でのみ機能します。

spl_autoload_register() を __autoload() の代替と見なすことができます。これは次のように定義できます。

__autoload() - 未定義のクラスをロードしようとする

例を使って理解しようとしましょう。

<?php
// we've writen this code where we need
function __autoload($classname) {
    $filename = "./". $classname .".php";
    include_once($filename);
}

// we've called a class ***
$obj = new myClass();
?>

ただし、クラスファイルごとにこの関数を記述する必要があるというデメリットがあります。

于 2015-05-18T07:20:56.110 に答える