php - Singleton 类出了问题,不知道是什么

标签 php oop singleton pdo

我以前从未做过任何 Singleton 类,现在我认为对于这个数据库连接来说,创建一个是个好主意,但我不知道为什么它不起作用。如果有人能帮助我解决这个问题,我真的很感激,因为我想了解 OOP 是如何工作的......

无论如何,我只是将 PHP 更新到最新版本就修复了这个问题,现在 $DBH = new static(); 工作正常,谢谢大家。

我尝试使用 $DBH = new static(); 而不是 $DBH = new self(); 但后来出现此错误:

Parse error: syntax error, unexpected T_STATIC, expecting T_STRING or T_VARIABLE or '$' in mSingleton.php on line 14

错误:

Fatal error: Cannot instantiate abstract class Singleton in mSingleton.php on line 14

文件: (mSingleton.php)

abstract class Singleton
{

    protected $DBH;

    public static function getInstance()
    {
        if ($DBH == null)
        {
            $DBH = new self();
        }

        return $DBH;
    }

}

(mDBAccess.php)

<?php
//mDBAccess.php
//Removed values ofc
$db_host = "";
$db_name = "";
$db_user = "";
$db_pass = "";

include "mSingleton.php";

class DBAccess extends Singleton
{
    protected $DBH;

    function __construct()
    {
        try
        {
        $this->DBH = new PDO("mysql:host=$db_host;dbname=$db_name", $db_user, $db_pass);
        $this->DBH->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
        }
        catch (PDOException $e)
        {
            echo $e->getMessage();
        }
    }

    public static function getDBH()
    {
        return self::getInstance()->DBH;
    }
}

(mLog.php)

<?php
//mLog.php
include "mDBAccess.php";

class Log
{

    public static function Add($action)
    {
        try
        {
            $DBH = DBAccess::getDBH();

            //Getting user IP
            $ip = $_SERVER['REMOTE_ADDR'];

            //Getting time
            $time = date('Y-m-d');

            //Preparing our SQL Query
            $values = array($ip, $action, $time);
            $STH = $DBH->prepare("INSERT INTO log (ip, action, time)
                                  VALUES (?, ?, ?)");

            //Excecuting SQL Query
            $STH->execute($values);
        }
        catch (PDOException $e)
        {
            echo $e->getMessage();
        }
    }

}
//testing..
Log::Add("ddd");

最佳答案

你需要写

$DBH = new static();

参见:Late Static Binding

关于php - Singleton 类出了问题,不知道是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4914302/

相关文章:

c# - 这个 Singleton 实现是否正确且线程安全?

php - 如何从 CSV 文件中拆分 php 中的字符串并插入数据库中的多行?

javascript - 为什么 javascript 协议(protocol)会自动解码 URL?

php - 如何知道是否插入了新行,或者是否更新了现有行?

javascript - OO-Javascript 和全局变量的奇怪行为

java - 设计模式 : Lazy Singleton, 泛型和继承 : java. lang.Class 无法转换为 java.lang.reflect.ParameterizedType

java - 什么是单例,用简单的英语?

php - JOINS 与 while 语句

c++ - 像虚拟成员(结构)

javascript - OO JS继承和原型(prototype)