我在我的小型MVC框架中使用PHP ActiveRecord,其中包括一个自动加载器。在我的控制器中,我访问模型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
{
}
答案 0 :(得分:1)
您似乎无法理解命名空间。
由于您使用的是命名空间App\Controllers
,因此全局命名空间用\
表示。
因此,如果您不想使用完全限定名称\Pub
,则必须在命名空间下面放置使用声明,例如:
namespace App\Controllers;
use Pub;
PS:将模型放在命名空间中也是一种很好的做法。