PHP 自动加载 class 未找到
PHP autoloading class not found
让我先解释一下我为达到这一点所做的工作。 github 上有一个名为 no-framework 的教程,https://github.com/PatrickLouys/no-framework-tutorial 非常好的教程!我已经完成了它,现在想添加更多的库。我有自动加载的作曲家设置,文件看起来像这样。
{
"name": "xxx/no-framework",
"description": "no framework",
"authors": [
{
"name": "xxx",
"email": "xxx@gmail.com"
}
],
"require": {
"php": ">=5.5.0",
"filp/whoops": ">=1.1.2",
"patricklouys/http": ">=1.1.0",
"nikic/fast-route": "^0.7.0",
"rdlowrey/auryn": "^1.1",
"twig/twig": "~1.0",
"illuminate/database": "*"
},
"autoload": {
"psr-4": {
"App\": "src/"
}
}
}
并且在我的 src
文件夹中,我创建了一个名为 Models
的文件夹,其中有一个 Books.php
,在 Books.php
我有这个
<?php
class Book extends \Illuminate\Database\Eloquent\Model{
protected $table = 'books';
}
在我的 Bootstrap.php
文件中,我在需要作曲家自动加载器后包含了这一行
include('Database.php');
Database.php
文件也在 src
中,看起来像这样
<?php
use \Illuminate\Database\Capsule\Manager as Capsule;
$capsule = new Capsule;
$capsule->addConnection(array(
'driver' => 'mysql',
'host' => 'localhost',
'database' => 'test',
'username' => 'test',
'password' => 'l4m3p455w0rd!',
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => ''
));
$capsule->bootEloquent();
现在是错误。当我尝试通过在我的控制器之一中使用 Book
class 时 use
<?php
namespace App\Controllers;
use Http\Request;
use Http\Response;
use App\Template\Renderer;
use App\Models\Book as Book;
class Pages{
private $request;
private $response;
private $renderer;
public function __construct(Request $request, Response $response, Renderer $renderer){
$this->request = $request;
$this->response = $response;
$this->renderer = $renderer;
}
public function index(){
$book = new Book;
$book->title = 'test';
$book->save();
$html = $this->renderer->render('index');
$this->response->setContent($html);
}
}
我收到一条错误消息,提示 "Class 'App\Models\Book' not found" 我假设我没有正确自动加载某些内容,但是 composer.json
中存在别名,或者可能是其他错误 IDK。帮助?
本教程使用一个名为 Auryn 的依赖注入器库,也许我在那里遗漏了什么? idk怀疑它。
编辑:如果我将 use
语句更改为 include
像这样
include('../src/Models/Book.php');
并像这样在 class 实例化前面放置一个 \
$book = new \Book;
然后它起作用了,但这显然不是正确的方法。
我相信 Composer classmap 只是告诉系统在哪里可以找到给定 class 的文件。 PHP 仍然需要知道命名空间。 Pages
在 App\Controllers
命名空间中。 Book
没有给出,因此它将存在于 \Book
的全局命名空间中。您的 Books.php
(文件名通常与它们包含的 class 相匹配,因此应该是 Book.php
)应该包含命名空间声明。我建议 namepsace App\Models;
。您还可以将 use
语句更改为 use \Book
.
请注意,您不需要为其添加别名。它是您唯一使用的 Book
class,就像您使用 Request
一样,class 可以由其完全命名空间指定的最后一段引用。
让我先解释一下我为达到这一点所做的工作。 github 上有一个名为 no-framework 的教程,https://github.com/PatrickLouys/no-framework-tutorial 非常好的教程!我已经完成了它,现在想添加更多的库。我有自动加载的作曲家设置,文件看起来像这样。
{
"name": "xxx/no-framework",
"description": "no framework",
"authors": [
{
"name": "xxx",
"email": "xxx@gmail.com"
}
],
"require": {
"php": ">=5.5.0",
"filp/whoops": ">=1.1.2",
"patricklouys/http": ">=1.1.0",
"nikic/fast-route": "^0.7.0",
"rdlowrey/auryn": "^1.1",
"twig/twig": "~1.0",
"illuminate/database": "*"
},
"autoload": {
"psr-4": {
"App\": "src/"
}
}
}
并且在我的 src
文件夹中,我创建了一个名为 Models
的文件夹,其中有一个 Books.php
,在 Books.php
我有这个
<?php
class Book extends \Illuminate\Database\Eloquent\Model{
protected $table = 'books';
}
在我的 Bootstrap.php
文件中,我在需要作曲家自动加载器后包含了这一行
include('Database.php');
Database.php
文件也在 src
中,看起来像这样
<?php
use \Illuminate\Database\Capsule\Manager as Capsule;
$capsule = new Capsule;
$capsule->addConnection(array(
'driver' => 'mysql',
'host' => 'localhost',
'database' => 'test',
'username' => 'test',
'password' => 'l4m3p455w0rd!',
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => ''
));
$capsule->bootEloquent();
现在是错误。当我尝试通过在我的控制器之一中使用 Book
class 时 use
<?php
namespace App\Controllers;
use Http\Request;
use Http\Response;
use App\Template\Renderer;
use App\Models\Book as Book;
class Pages{
private $request;
private $response;
private $renderer;
public function __construct(Request $request, Response $response, Renderer $renderer){
$this->request = $request;
$this->response = $response;
$this->renderer = $renderer;
}
public function index(){
$book = new Book;
$book->title = 'test';
$book->save();
$html = $this->renderer->render('index');
$this->response->setContent($html);
}
}
我收到一条错误消息,提示 "Class 'App\Models\Book' not found" 我假设我没有正确自动加载某些内容,但是 composer.json
中存在别名,或者可能是其他错误 IDK。帮助?
本教程使用一个名为 Auryn 的依赖注入器库,也许我在那里遗漏了什么? idk怀疑它。
编辑:如果我将 use
语句更改为 include
像这样
include('../src/Models/Book.php');
并像这样在 class 实例化前面放置一个 \
$book = new \Book;
然后它起作用了,但这显然不是正确的方法。
我相信 Composer classmap 只是告诉系统在哪里可以找到给定 class 的文件。 PHP 仍然需要知道命名空间。 Pages
在 App\Controllers
命名空间中。 Book
没有给出,因此它将存在于 \Book
的全局命名空间中。您的 Books.php
(文件名通常与它们包含的 class 相匹配,因此应该是 Book.php
)应该包含命名空间声明。我建议 namepsace App\Models;
。您还可以将 use
语句更改为 use \Book
.
请注意,您不需要为其添加别名。它是您唯一使用的 Book
class,就像您使用 Request
一样,class 可以由其完全命名空间指定的最后一段引用。