繁体   English   中英

php autoloader致命错误:找不到类

[英]php autoloader Fatal error: Class not found

我正在使用PHP ActiveRecord与我的小MVC框架thtat包括一个自动加载器。 在我的控制器中,我访问模型Pub :: find(64)。

我的问题是Pub :: find(64)继承了控制器的命名空间,我得到了错误

Fatal error: Class 'App\Controllers\Pub' not found in /home/i554246/public_html/mvc/App/Controllers/Index.php on line 27

Pub是模块名称。 该文件包括在内。 我可以通过附加\\ Pub :: find(64)来解决这个问题,但这对于项目中的新人来说并不是很直观。

有没有办法在不改变该行的情况下停止为Pub :: find(64)附加命名空间?

索引控制器

namespace App\Controllers;

class Index extends \Core\Controller
{
    protected
        $title = 'Home'
        ;

    /**
     * Default action
     */
    public function index()
    {
        // Pass the data to the view to display it
        $this->view->set('testdb', \Pub::find(64));

    }
}

App.php

/**
 * Class autoloader
 * @param $className
 * @see https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md
 */
public function autoload($className)
{
    preg_match('/(^.+\\\)?([^\\\]+)$/', ltrim($className, '\\'), $match);

    //Build namespace Autoloading
    $file = str_replace('\\', '/', $match[1]) . str_replace('_', '/', $match[2]) . '.php';

    //Build Model path
    $model = 'App/Models/' . $match[2] . '.php';

    if ( is_file($file) ) {
        require $file;
    }elseif ( is_file($model) ) {
        require $model;
    }

}

型号/ Pub.php

class Pub extends ActiveRecord\Model
{
}

看来你不懂命名空间。

由于您使用的是命名空间App\\Controllers ,因此全局命名空间用\\表示。 因此,如果您不想使用完全限定的名称\\Pub您必须在命名空间下面放置使用声明,例如:

namespace App\Controllers;
use Pub;

PS:将模型放在命名空间中也是一种很好的做法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM