首页 > 解决方案 > 找不到 PHP 类

问题描述

我创建了一个单例类来返回我的数据库连接。我唯一要做的就是getInstance()从另一个 php 文件中调用它的函数。

这是单例文件:

<?php

namespace stm_asc;

class PDO_Conn
{
    public static $instance;

    private static $host = '127.0.0.1';
    private static $db   = 'stm_asc';
    private static $charset = 'utf8mb4';
    private static $user = 'alekrabbe';
    private static $pass = '<password>';

    private static $dsn;
    private static $opt = [
        PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
        PDO::ATTR_EMULATE_PREPARES   => false,
    ];

    private function __construct() {
        //
    }

    public static function getInstance() {
        if (!isset(self::$instance)) {
            try {
                self::$dsn = "mysql:host=".self::$host.";dbname=".self::$db.";charset=".self::$charset.";";
                self::$instance = new PDO(self::$dsn, self::$user, self::$pass, self::$opt);
                echo "Connected successfully";
            } catch(PDOException $e) {
                echo "Connection failed: " . $e->getMessage();
            }
        }

        return self::$instance;
    }
}

然后我所做的是login.php调用函数getInstance(),如下所示:

<?php
error_reporting(E_ALL);
ini_set("display_errors","On");
$pdo = \stm_asc\PDO_Conn::getInstance();
//session_start();    
?>

<!DOCTYPE html>
<html>
 [HTML CODE HERE]
</html>

但是当我尝试闲逛时,login.php我收到以下错误:

Fatal error: Uncaught Error: Class 'stm_asc\PDO_Conn' not found in /home/alekrabbe/PhpstormProjects/selectorHat/views/login.php:4 Stack trace: #0 {main} thrown in /home/alekrabbe/PhpstormProjects/selectorHat/views/login.php on line 4

我不确定为什么找不到类 PDO_Conn,这是我的目录结构:

在此处输入图像描述

如果我评论这条线,$pdo = \stm_asc\PDO_Conn::getInstance();一切都很好。

我正在使用 PHP 7.2.7 和 Ubuntu 18.04


编辑 1

所以我按照这个文档尝试使用自动加载器。但是它仍然无法正常工作,这是代码:

<?php
session_start();
spl_autoload_register(function ($name) {
    echo "Want to load $name.\n";
    throw new Exception("Unable to load $name.");
});

try {
    $pdo = \stm_asc\PDO_Conn::getInstance();
    $mapper = new \stm_asc\MySQL_DataMapper($pdo);
    $stuff = $mapper->fetchUserByFname('Alexandre');
    var_dump($stuff);
} catch (Exception $e) {
    echo $e->getMessage(), "\n";
}   


?>

<!DOCTYPE html>
<html>
 [HTML CODE HERE]
</html>

这是出现在屏幕上的消息:

Want to load stm_asc\PDO_Conn. Unable to load stm_asc\PDO_Conn.

但是现在正在加载 html、css 和 java 脚本,我相信这是由于 try catch 块。

我也尝试require_once '../controller/database/PDO_Conn.php';在 login.php 的开头添加,所以它看起来像这样:

<?php
require_once '../controller/database/PDO_Conn.php';
$pdo = \stm_asc\PDO_Conn::getInstance();
?>

<!DOCTYPE html>
<html>
 [HTML CODE HERE]
</html>

但错误仍然存​​在:

Fatal error: Uncaught Error: Class 'stm_asc\PDO_Conn' not found in /home/alekrabbe/PhpstormProjects/selectorHat/views/login.php:22 Stack trace: #0 {main} thrown in /home/alekrabbe/PhpstormProjects/selectorHat/views/login.php on line 22

标签: php

解决方案


解决方案 1:在您的login.php.

<?php 
require_once '../path/to/file.php';

在您的情况下:(来自 login.php)

<?php 
require_once '../controller/database/PDO_Conn.php';

解决方案2:(推荐)

使用 PHP Autoloader:请参阅我在 GitHub 中为您设置的这个简单的自动加载示例。

附加资源:how-do-i-use-php-namespaces-with-autoload


推荐阅读