0

PHP で Namespace をいじっていて、それを機能させようとしていましたが、失敗しました

コード例を示します。

test\views\classes\MainController.php

<?php
namespace test\views\classes;

class MainController
{
    public function echoData()
    {
        echo 'ECHOD';
    }
}

test\views\index.php

<?php
require_once '..\autoloader\autoloader.php';

use test\views\classes\MainController;

$cont = new MainController();

$cont->echoData();

test\autoloader\autoloader.php

<?php

spl_autoload_register(null, FALSE);

spl_autoload_extensions('.php');


function classLoader($class)
{
    $fileName = strtolower($class) . '.php';

    $file = 'classes/' . $fileName;

    if(!file_exists($file))
    {
        return FALSE;
    }

    include $file;
}

spl_autoload_register('classLoader');

エラーをスローします:

Fatal error: Class 'test\views\classes\MainController' not found in ..\test\views\index.php on line 6

私は何かが欠けています!

編集: index.php と maincontroller.php の両方が同じディレクトリにあり、オートローダーを使用せずに require_once('maincontroller.php'); を使用すると、コードは正常に機能します。それらが異なるディレクトリにあり、オートローダー機能を使用している場合は機能しません。誰でもこれを整理できますか。

ありがとう

4

2 に答える 2

1

コード内の複数の問題:

名前空間区切り記号 (\) は、Linux/Unix では有効なパス区切り記号ではありません。オートローダーは次のようにする必要があります。

$classPath = str_replace('\\', '/', strtolower($class)) . '.php';
if (!@include_once($classPath)) {
 throw new Exception('Unable to find class ' .$class);
}

さらに、パスはすべて相対的です。インクルード パスを設定する必要があります。サイト構造が次のような場合:

bootstrap.php
lib/
  test/
    views/
      index.php
      classes/
        maincontroller.php
  autoloader/
    autoloader.php

あなたの bootstrap.php は次のようになります。

$root = dirname(__FILE__);
$paths = array(
    ".",
    $root."/lib",
    get_include_path()
);
set_include_path(implode(PATH_SEPARATOR, $paths));
include 'lib/test/autoloader/autoloader.php';

これで、test/views/index.php にブートストラップを含めることができます:

include '../../bootstrap.php';
于 2012-07-26T16:00:26.827 に答える
0

クラスローダーにdieステートメントを追加します。

$file = 'classes/' . $fileName;

die('File ' . $file . "\n");

そして、あなたは

File classes/test\views\classes\maincontroller.php

それは本当にあなたのメインコントローラークラスが住んでいるところですか?

于 2012-07-26T20:28:14.870 に答える