4

メインディレクトリに5つのクラス(Ad_Class、Blocked_Class、Friend_Class、Image_Class、Profile_Class)を含む5つのフォルダを作成しました。また、上記のフォルダー内に、フォルダーとまったく同じ名前でそれぞれのクラスを作成しました。つまり、フォルダ名がAd_Classの場合、フォルダ内のクラスも「classAd_Class」のフォルダ名と同じです。

index.phpファイルに、次のコードを記述しました。

function Ad_Class($name)
{
    include "Ad_Class/$name.php";
}
function Blocked_Class($name)
{
    include "Blocked_Class/$name.php";
}
function Friend_Class($name)
{
    include "Friend_Class/$name.php";
}
function Image_Class($name)
{
    include "Image_Class/$name.php";
}
function Profile_Class($name)
{
    include "Profile_Class/$name.php";
}

spl_autoload_register("Ad_Class");
spl_autoload_register("Blocked_Class");
spl_autoload_register("Friend_Class");
spl_autoload_register("Image_Class");
spl_autoload_register("Profile_Class");

$a = new Ad_Class;
$b = new Blocked_Class;
$c = new Blocked_Class;
$d = new Image_Class;
$e = new Profile_Class;

上記のコードを実行した後、以下の警告が表示されます。

Warning: include(Ad_Class/Blocked_Class.php): failed to open stream: No such file or directory in C:\Users\Robert\Documents\web development\xampp\htdocs\xampp\web_development\development.php on line 4

Warning: include(): Failed opening 'Ad_Class/Blocked_Class.php' for inclusion (include_path='.;C:\Users\Robert\Documents\web development\xampp\php\PEAR') in C:\Users\Robert\Documents\web development\xampp\htdocs\xampp\web_development\development.php on line 4

Warning: include(Ad_Class/Image_Class.php): failed to open stream: No such file or directory in C:\Users\Robert\Documents\web development\xampp\htdocs\xampp\web_development\development.php on line 4

Warning: include(): Failed opening 'Ad_Class/Image_Class.php' for inclusion (include_path='.;C:\Users\Robert\Documents\web development\xampp\php\PEAR') in C:\Users\Robert\Documents\web development\xampp\htdocs\xampp\web_development\development.php on line 4

Warning: include(Blocked_Class/Image_Class.php): failed to open stream: No such file or directory in C:\Users\Robert\Documents\web development\xampp\htdocs\xampp\web_development\development.php on line 8

Warning: include(): Failed opening 'Blocked_Class/Image_Class.php' for inclusion (include_path='.;C:\Users\Robert\Documents\web development\xampp\php\PEAR') in C:\Users\Robert\Documents\web development\xampp\htdocs\xampp\web_development\development.php on line 8

Warning: include(Friend_Class/Image_Class.php): failed to open stream: No such file or directory in C:\Users\Robert\Documents\web development\xampp\htdocs\xampp\web_development\development.php on line 12

Warning: include(): Failed opening 'Friend_Class/Image_Class.php' for inclusion (include_path='.;C:\Users\Robert\Documents\web development\xampp\php\PEAR') in C:\Users\Robert\Documents\web development\xampp\htdocs\xampp\web_development\development.php on line 12

Warning: include(Ad_Class/Profile_Class.php): failed to open stream: No such file or directory in C:\Users\Robert\Documents\web development\xampp\htdocs\xampp\web_development\development.php on line 4

Warning: include(): Failed opening 'Ad_Class/Profile_Class.php' for inclusion (include_path='.;C:\Users\Robert\Documents\web development\xampp\php\PEAR') in C:\Users\Robert\Documents\web development\xampp\htdocs\xampp\web_development\development.php on line 4

Warning: include(Blocked_Class/Profile_Class.php): failed to open stream: No such file or directory in C:\Users\Robert\Documents\web development\xampp\htdocs\xampp\web_development\development.php on line 8

Warning: include(): Failed opening 'Blocked_Class/Profile_Class.php' for inclusion (include_path='.;C:\Users\Robert\Documents\web development\xampp\php\PEAR') in C:\Users\Robert\Documents\web development\xampp\htdocs\xampp\web_development\development.php on line 8

Warning: include(Friend_Class/Profile_Class.php): failed to open stream: No such file or directory in C:\Users\Robert\Documents\web development\xampp\htdocs\xampp\web_development\development.php on line 12

Warning: include(): Failed opening 'Friend_Class/Profile_Class.php' for inclusion (include_path='.;C:\Users\Robert\Documents\web development\xampp\php\PEAR') in C:\Users\Robert\Documents\web development\xampp\htdocs\xampp\web_development\development.php on line 12

Warning: include(Image_Class/Profile_Class.php): failed to open stream: No such file or directory in C:\Users\Robert\Documents\web development\xampp\htdocs\xampp\web_development\development.php on line 16

Warning: include(): Failed opening 'Image_Class/Profile_Class.php' for inclusion (include_path='.;C:\Users\Robert\Documents\web development\xampp\php\PEAR') in C:\Users\Robert\Documents\web development\xampp\htdocs\xampp\web_development\development.php on line 16

なぜこうなった?誰か説明できますか?

更新:次のコードが機能することがわかりました。何か提案があれば、遠慮なく共有してください!

function ad_class($class)
{
    if(!class_exists($class) && $class == "Ad_Class")
    {
        include "Ad_Class/$class" . ".php";
    }
    elseif(!class_exists($class))
    {
        return;
    }
}

function blocked_class($class)
{
    if(!class_exists($class) && $class == "Blocked_Class")
    {
        include "Blocked_Class/$class" . ".php";
    }
    elseif(!class_exists($class))
    {
        return;
    }
}

function friend_class($class)
{
    if(!class_exists($class) && $class == "Friend_Class")
        {
        include "Friend_Class/$class" . ".php";
    }
    elseif(!class_exists($class))
    {
        return;
    }
}

function image_class($class)
{
    if(!class_exists($class) && $class == "Image_Class")
    {
        include "Image_Class/$class" . ".php";
    }
    elseif(!class_exists($class))
    {
        return;
    }
}

function profile_class($class)
{
        if(!class_exists($class) && $class == "Profile_Class")
    {
        include "Profile_Class/$class" . ".php";
    }
    elseif(!class_exists($class))
    {
        return;
    }
}
spl_autoload_register("ad_class");
spl_autoload_register("blocked_class");
spl_autoload_register("friend_class");
spl_autoload_register("image_class");
spl_autoload_register("profile_class");

$a = new Ad_Class;
$a->ad();

$b = new Blocked_Class;
$b->block();

$c = new Friend_Class;
$c->fr();

$d = new Image_Class;
$d->image();

それは以下を生成します:広告ブロックされた友達の画像

これは、インスタンス化されたオブジェクトのクラス名を表示して、コードがクラスのロードで正しく機能したかどうかを確認するだけです。

4

1 に答える 1

7

spl_autoload_register()スタックするため、作成しようとするクラスごとに定義した5つの関数すべてが、どのクラスであるかに関係なく実行されます。この例を取り上げて、ニーズに合わせて作り直します。

spl_autoload_register( function($name) {
    if (is_file('/classes/'.$name.'.class.php')) {
        require_once('/classes/'.$name.'.class.php');
    }
});

でファイルをチェックすると、そのようなファイルやディレクトリの警告がないis_file()すべての人の頭痛の種を救うことができます。ファイルパスのレイアウトによっては、ステートメントなどで指定した無名関数の例を拡張する必要がある場合があります。switch()

于 2013-02-08T16:02:29.240 に答える