在自动加载和名称空间方面遇到麻烦,有人可以发现我的错误吗?
Having trouble with autoloading and namespaces , can someone spot what bugs me ?
我目前正在学习 php/mysql,但我一直在学习教程。
它是关于 AUtoloding 和命名空间的。
我的代码看起来像这样:我将按文件名来分隔文件。
Folders :
mysite/
app/
Autoloader.php
Database.php
pages/
home.php
single.php
Template/
default.php
public/
index.php
我的代码:
/public/Index.php ======================================= =====
<?php
require '../app/Autoloader.php';
App\Autoloader::register();
if (isset($_GET['p'])) {
$p = $_GET['p'];
} else {
$p = 'home';
}
ob_start();
if ($p === 'home') {
require '../pages/home.php';
} elseif ($p === 'single') {
require '../pages/single.php';
}
$content = ob_get_clean();
require '../pages/template/default.php';
/app/Autoloader.php ======================================= =========
<?php
namespace App;
class Autoloader
{
static function register()
{
spl_autoload_register(array(__CLASS__, 'autoload'));
}
static function autoload($class_name)
{
if (strpos(__NAMESPACE__, '\') === 0) {
$class = str_replace(__NAMESPACE__, '\', '', $class);
$class = str_replace('\', '', $class);
require __DIR__.'/'.$class_name.'.php';
}
}
}
/app/Database.php ================================== ============
<?php
namespace App;
use \PDO;
class Database
{
private $db_name;
private $db_user;
private $db_pass;
private $db_host;
private $pdo;
public function __construct($db_name, $db_user = 'root', $db_pass = 'password', $db_host = 'localhost')
{
$this->db_name = $db_name;
$this->db_pass = $db_pass;
$this->db_user = $db_user;
$this->db_host = $db_host;
}
private function getPDO()
{
$pdo = new PDO('mysql:dbname=blog;host=localhost', 'root', 'password');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$this->pdo = $pdo;
return $pdo;
}
public function query($statement)
{
$req = $this->getPDO()->query($statement);
$datas = $req->fetchAll(PDO::FETCH_OBJ);
return $datas;
}
}
我的错误信息:
致命错误:在第 3 行的 C:\wamp\www\Johan 的 Blog\pages\home.php 中找不到 Class 'App\Database'
所以我想在 Autoloader 中他不需要 Database.php。
但我看不出哪里出了问题。
我真的不明白命名空间的事情。
如果有人有线索?
提前致谢:)
祝你有美好的一天!
在您的错误中,我们可以看到您的页面 C:\wamp\www\Johan's Blog\pages\home.php
正在尝试使用 class 'App\Database'。
我认为问题是你的命名空间路径在这里是相对的,从位于同一路径的 class 寻找。您应该尝试将它与绝对路径一起使用,\App\Database
而不是 App\Database
.
要很好地理解名称空间的使用方式和工作原理,您应该编写简单的脚本来自学它的实际工作原理,因为理解它很重要。尝试阅读一些教程,伙计,祝你好运 :) !
我目前正在学习 php/mysql,但我一直在学习教程。 它是关于 AUtoloding 和命名空间的。
我的代码看起来像这样:我将按文件名来分隔文件。
Folders :
mysite/
app/
Autoloader.php
Database.php
pages/
home.php
single.php
Template/
default.php
public/
index.php
我的代码:
/public/Index.php ======================================= =====
<?php
require '../app/Autoloader.php';
App\Autoloader::register();
if (isset($_GET['p'])) {
$p = $_GET['p'];
} else {
$p = 'home';
}
ob_start();
if ($p === 'home') {
require '../pages/home.php';
} elseif ($p === 'single') {
require '../pages/single.php';
}
$content = ob_get_clean();
require '../pages/template/default.php';
/app/Autoloader.php ======================================= =========
<?php
namespace App;
class Autoloader
{
static function register()
{
spl_autoload_register(array(__CLASS__, 'autoload'));
}
static function autoload($class_name)
{
if (strpos(__NAMESPACE__, '\') === 0) {
$class = str_replace(__NAMESPACE__, '\', '', $class);
$class = str_replace('\', '', $class);
require __DIR__.'/'.$class_name.'.php';
}
}
}
/app/Database.php ================================== ============
<?php
namespace App;
use \PDO;
class Database
{
private $db_name;
private $db_user;
private $db_pass;
private $db_host;
private $pdo;
public function __construct($db_name, $db_user = 'root', $db_pass = 'password', $db_host = 'localhost')
{
$this->db_name = $db_name;
$this->db_pass = $db_pass;
$this->db_user = $db_user;
$this->db_host = $db_host;
}
private function getPDO()
{
$pdo = new PDO('mysql:dbname=blog;host=localhost', 'root', 'password');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$this->pdo = $pdo;
return $pdo;
}
public function query($statement)
{
$req = $this->getPDO()->query($statement);
$datas = $req->fetchAll(PDO::FETCH_OBJ);
return $datas;
}
}
我的错误信息:
致命错误:在第 3 行的 C:\wamp\www\Johan 的 Blog\pages\home.php 中找不到 Class 'App\Database'
所以我想在 Autoloader 中他不需要 Database.php。 但我看不出哪里出了问题。 我真的不明白命名空间的事情。
如果有人有线索?
提前致谢:) 祝你有美好的一天!
在您的错误中,我们可以看到您的页面 C:\wamp\www\Johan's Blog\pages\home.php
正在尝试使用 class 'App\Database'。
我认为问题是你的命名空间路径在这里是相对的,从位于同一路径的 class 寻找。您应该尝试将它与绝对路径一起使用,\App\Database
而不是 App\Database
.
要很好地理解名称空间的使用方式和工作原理,您应该编写简单的脚本来自学它的实际工作原理,因为理解它很重要。尝试阅读一些教程,伙计,祝你好运 :) !