php - 在自动加载和命名空间方面遇到问题,有人能发现是什么让我烦恼吗?

标签 php mysql class namespaces autoloader

我现在正在学习 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;
    }
}

我的错误消息:

fatal error :在第 3 行的 C:\wamp\www\Johan's Blog\pages\home.php 中找不到类“App\Database”

所以我想在自动加载器中他不能需要Database.php。 但我看不出我哪里出了问题。 我真的不明白命名空间的事情。

如果有人有线索吗?

提前致谢:) 祝你有美好的一天!

最佳答案

在您的错误中,我们可以看到您的页面C:\wamp\www\Johan's Blog\pages\home.php正在尝试使用“App\Database”类。

我认为问题在于您的命名空间路径在这里是相对的,从位于同一路径的类中查找。您应该尝试使用绝对路径 \App\Database 而不是 App\Database

为了很好地理解命名空间的使用方式及其工作原理,您应该编写简单的脚本来教自己它的真正工作原理,因为理解它是一件很重要的事情。尝试阅读一些教程,伙计,祝你好运:)!

关于php - 在自动加载和命名空间方面遇到问题,有人能发现是什么让我烦恼吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37774448/

相关文章:

php - PDO查询问题

php - 操作码缓存实际上是如何工作的?

php - 选择一个选择的项目

java - 通用 setter 方法不兼容类型错误

java - 使用继承时如何创建对象?

javascript 使用一个对象方法进入另一个对象

PHP 检测类似机器人的行为

mysql - QMYSQL 驱动程序未加载(其他解决方案?)

mysql - 对于 Homebrew mysql 安装,my.cnf 在哪里?

php - 避免多个 LEFT JOIN