3

そのため、以前にここでこの質問をしましたが、提供された解決策はうまくいきませんでした。これが私のセットアップです:

/mylib
    /Vendor/Module/MyClass.php
/document_root
    index.php

これが私のindex.phpです

<?php


define('CLASSDIR', 'mylib');
define('BASEPATH',  @realpath( dirname (__FILE__).'/../').'/'.CLASSDIR);

spl_autoload_register(null, false);
spl_autoload_extensions('.php');

function autoLoader($className){

    $className = ltrim($className, '\\');
    $fileName  = '';
    $namespace = '';
    if ($lastNsPos = strrpos($className, '\\')) {
        echo 'does it come here? nope.'; 
        $namespace = substr($className, 0, $lastNsPos);
        $className = substr($className, $lastNsPos + 1);
        $fileName  = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;
    }
    $fileName .= BASEPATH.'/'.str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';

    require $fileName; 
}

spl_autoload_register('autoLoader');

//$obj = new MyClass();

$obj = new \Vendor\Module\MyClass();

$obj::test();

 ?>

ここに私の MyClass.php があります

<?php

namespace Vendor\Module;

class MyClass{

    public function __construct(){
        echo 'weird';
    }

    public function test(){
        echo 'strange';
    }
}
?>

私のエコーは何も表示しません。明らかに、私のクラスもロードされていません。代わりに、このエラーが発生します。

Fatal error: Call to undefined method MyClass::test() in /<documentroot>/index.php on line 29

助けてください。私はかなり長い間これに固執しており、残りの開発は苦しんでいます。spl_autoload_register()おすすめの方法なので移動してみました。今、失われた時間が私を後悔させています。

4

2 に答える 2

4

test()関数を間違って呼び出しています (静的な方法を使用していますか?)。

次のように関数を呼び出します。

$obj = new MyClass();
$obj->test();

のような静的メソッドを使用する場合MyClass::test()は、クラスで関数を次のように宣言します。

public static function test() {
}

さらに、オートローダーは複雑すぎます。次のように簡略化できます。

$class_dir = array(
    '/mylib/Vendor/Module/',
    // Add more paths here ( or you can build your own $class_dir )
);

function class_loader($class_name) {
    global $class_dir;
    foreach ($class_dir as $directory) {
        if (file_exists($directory . $class_name . '.php')) {
            require_once($directory . $class_name . '.php');
            return;
        }
    }
}
spl_autoload_register('class_loader');

3回目の編集:

設定したパスが間違っていることに気付きました。

$fileName .= BASEPATH.'/'.str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';

そのはず:

$filename = BASEPATH .'/' . $filename . str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';

前に述べたように、 の値をエコーすることで簡単にデバッグできます$filename

于 2013-10-24T04:25:06.817 に答える