1. ホーム
  2. php

[解決済み] PHP の名前空間を autoload で使用するにはどうしたらよいですか?

2022-12-02 08:56:12

質問

autoloadとnamespacesを使おうとすると、こんなエラーが出ます。

致命的なエラーです。 クラス 'Class1' が /usr/local/www/apache22/data/public/php5.3/test.php に見つかりませんでした。 において 10行目

何が間違っているのか、どなたか教えていただけませんか?

以下は私のコードです。

Class1.php。

<?php

namespace Person\Barnes\David
{
    class Class1
    {
        public function __construct()
        {
            echo __CLASS__;
        }
    }
}

?>

test.phpになります。

<?php

function __autoload($class)
{
    require $class . '.php';
}

use Person\Barnes\David;

$class = new Class1();

?>

どのように解決するのですか?

Class1 がグローバルスコープにない。

これは古い回答で、あなたが spl_autoload_register() のサポートを仮定することができなかった時代(もう何年も前のことです!)から変わっていることに注意してください。

最近では、おそらくComposerを使用していることでしょう。ボンネットの中では、次のスニペットのようなものが有効になっているはずです。 クラスのオートローディング .

spl_autoload_register(function ($class) {
    // Adapt this depending on your directory structure
    $parts = explode('\\', $class);
    include end($parts) . '.php';
});

完全を期すために、古い答えを示します。

グローバルスコープで定義されていないクラスをロードするには、オートローダを使用する必要があります。

<?php

// Note that `__autoload()` is removed as of PHP 8 in favour of 
// `spl_autoload_register()`, see above
function __autoload($class)
{
    // Adapt this depending on your directory structure
    $parts = explode('\\', $class);
    require end($parts) . '.php';
}

use Person\Barnes\David as MyPerson;

$class = new MyPerson\Class1();

またはエイリアスなし

use Person\Barnes\David\Class1;

$class = new Class1();