单例 PDO 模型 - 层次结构

2023-12-25

抱歉英语不好,我是巴西人,更糟糕的是谈论编程。 我们走吧。我有这个:

class DataBase extends PDO
{

/**
 * @var object PDO
 */
private static $instance;


/**
 * Cria uma instância do PDO representando a conexão ao banco de dados e torna a instância disponível como "singleton"
 *
 * @param string $dsn            O DSN completo, ex.: mysql:host=localhost;dbname=testdb
 * @param string $username       O nome de usuário para a string DSN. Esse parâmetro é opcional para alguns drivers do PDO.
 * @param string $password       A senha para a string DSN. Esse parâmetro é opcional para alguns drivers do PDO.
 * @param array  $driver_options Um array key => value de opções de conexão específicas do driver
 *
 * @return PDO
 */
public
function __construct()
{

    global $config;

    $dsn      = "mysql:dbname={$config['database'][AMBIENTE]['banco']};host={$config['database'][AMBIENTE]['url']}";
    $username = $config['database'][AMBIENTE]['usuario'];
    $password = $config['database'][AMBIENTE]['senha'];

    if ( !isset ( self::$instance ) )
    {
        try
        {
            self::$instance = parent::__construct( $dsn , $username , $password );
        }
        catch ( PDOException $e )
        {
            Functions::Log( 'Erro de conexão de banco de dados: ' . $e->getMessage() );
            header( 'HTTP/1.1 500 Internal Server Error' );
        }
    }

    $this->storage = new ArrayObject();

}

public static
function getInstance()
{
    if ( !self::$instance )
    {
        self::$instance = new DataBase;
    }

    return self::$instance;
}

 }

以及扩展 DataBase 类的模型:

class Model extends DataBase
{
protected $TABLE_NAME;
protected $TABLE_PREFIX;
/* all logic here, like getters, setters and methods like update, delete and insert... */
}

但我无法使用 $this 变量来访问 PDO 方法,例如查询或准备。据说即使我的 Model 类构造函数调用 getInstance,我也不会被称为 PDO 构造函数。

这是可能的?


为了让你的例子工作,你可以尝试这个。

define('DB_CONN','mysql:dbname=;host=');
define('DB_USER', '');
define('DB_PASS', '');

interface iMySQL
{

    public
    function query( $string );

    public
    function select();

    public
    function selectAll();

    public
    function insert();

    public
    function update();

    public
    function delete();

    public
    function load();

}



class DataBase
{

    /**
     * @var object PDO
     */
    private static $instance = null;


    /**
     * Cria uma instância do PDO representando a conexão ao banco de dados e torna a instância disponível como "singleton"
     *
     * @param string $dsn            O DSN completo, ex.: mysql:host=localhost;dbname=testdb
     * @param string $username       O nome de usuário para a string DSN. Esse parâmetro é opcional para alguns drivers do PDO.
     * @param string $password       A senha para a string DSN. Esse parâmetro é opcional para alguns drivers do PDO.
     * @param array  $driver_options Um array key => value de opções de conexão específicas do driver
     *
     */
    private function __construct() {

    }

    public static function getInstance()
    {
        if ( self::$instance === null )
        {
            self::$instance = new PDO(DB_CONN, DB_USER, DB_PASS);
        }
        return self::$instance;
    }

}

class Model
{
    protected $TABLE_NAME;
    protected $TABLE_PREFIX;
    protected $clausula;

    private $storage;

    /**
     * Recupera um registro utilizando sua chave
     *
     * @param string $key
     *
     * @return mixed O valor armazenado
     * @throws RuntimeException Se não houver um registro para a chave especificada
     */
    public
    function __get( $key )
    {

    }

    /**
     * Registra um valor à uma chave
     *
     * @param string $key   A chave que será utilizada no registro
     * @param mixed  $value O valor que será registrado
     *
     * @throws LogicException Se a chave já estiver registrada
     */
    public
    function __set( $key , $value )
    {
        //echo $key;
    }


    public static
    function __callStatic( $method , $args )
    {

        $database = DataBase::getInstance();
        $callback = array( $database , $method );
        return call_user_func_array( $callback , $args );

    }

    public
    function __call( $method , $args )
    {

        $database = DataBase::getInstance();
        $callback = array( $database , $method );
        return call_user_func_array( $callback , $args );

    }

    public function __construct( $table_name = null , $id = null )
    {

        $this->TABLE_PREFIX = $this->config['database']['table_prefix'];
        $this->TABLE_NAME   = $this->TABLE_PREFIX . $table_name;

        $this->storage = new ArrayObject();

        if ( !is_null( $table_name ) )
        {
            $array = $this->query( "SHOW COLUMNS FROM `$this->TABLE_NAME`" )->fetchAll();

            $colunas      = array();
            $obrigatorias = array();

            foreach ( $array as $value )
            {
                $colunas[] = $value[0];
                if ( $value['Null'] === 'NO' )
                {
                    $obrigatorias[] = $value['Field'];
                }
            }

            $this->colunas       = $colunas;
            $this->obrigatorias  = $obrigatorias;
            $this->total_colunas = count( $this->colunas );

            // Se passou um id por parâmetro, salva nas propriedades do objeto
            if ( !is_null( $id ) AND is_numeric( $id ) )
            {
                $this->id = $id;

                // E já carrega o objeto
                $select = $this->query( 'SELECT * FROM {tabela_nome} WHERE `id` = ' . $id )->fetchObject();
                $this->load( $select );
            }
        }

    }

    public
    function insert()
    {
    }

    public
    function update()
    {
    }

    public
    function delete()
    {
    }

    public
    function select( $clausula = NULL , $is_array = FALSE )
    {
        // Caso seja passado uma cláusula diretamente para a função, executa ela
        if ( !is_null( $clausula ) )
        {
            $this->clausula = $clausula;
        }

        // Troca uma possível variável pelo nome da tabela do Model
        $this->clausula = ( str_replace( '{TABLE_NAME}' , $this->TABLE_NAME , $this->clausula ) );
        $this->clausula = ( str_replace( '{TABLE_PREFIX}' , $this->TABLE_PREFIX , $this->clausula ) );

        // Executa o SELECT no banco de dados
        $query = $this->query( $this->clausula );

        if ( $query AND $query->rowCount() > 0 )
        {

            if ( $query->rowCount() == 1 AND !$is_array )
            {
                return $query->fetchObject( get_class( $this ) );
            }
            else
            {
                $objetos = array();
                while ( $linha = $query->fetchObject( get_class( $this ) ) )
                {
                    $objetos[] = $linha;
                }
                return ( count( $objetos ) > 0 ) ? $objetos : FALSE;
            }
        }
        else
        {
            return FALSE;
        }
    }

    public
    function selectAll()
    {
    }

    public
    function load()
    {
    }
}



$model = new Model();
$stmt = $model->query();
$fetch = $stmt->fetchAll();
var_dump($fetch);

这个没有经过测试。但它应该让您了解如何解决问题。 尝试这种方法。

define('DB_TYPE', 'DB_Class_One');


class DB_Class_One extends PDO {
    public function getData() {
        print 'Class One';
    }
}

class DB_Class_Two extends PDO {
   public function getData() {
        print 'Class Two';
    }
}

class DB_Class_Three extends PDO {
   public function getData() {
        print 'Class Three';
    }
}

class DataBase {

    private static $instance = null;

    private function __construct() {

    }

    private function __clone() {

    }

    public static function getInstance() {
        $class = DB_TYPE;

        if (self::$instance === null) {
            self::$instance = new $class("mysql:host=;dbname=", '', '');
        }
        return self::$instance;
    }


}




$db = DataBase::getInstance();

$stmt = $db->query();

$result = $stmt->fetch();

$db->getData();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

单例 PDO 模型 - 层次结构 的相关文章

  • INNER JOIN 后从多个表获取最大日期

    我有以下两个表 table 1 ID HOTEL ID NAME 1 100 xyz 2 101 pqr 3 102 abc table 2 ID BOOKING ID DEPARTURE DATE AMOUNT 1 1 2013 04 1
  • 是否可以在 PHP 中使用 file_get_contents 来破坏 CSRF 令牌验证

    在每个会话的表单上使用令牌的 CSRF 预防方法是一种流行的方法 但是 我不明白这种令牌方式如何保护file get contentsPHP 可以获取跨域文件表单的内容 gt 它可以获取表单上的令牌并使用它 那么这种token方式是如何运作
  • MySQL Workbench 忽略外键

    在处理 MySQL Workbench 中的 SQL 编辑器时 我偶然发现了一些奇怪的事情 其中 执行似乎忽略了外键约束 这是一个例子 create database testdb use testdb create table t1 te
  • MySQL 帮助:如何查找客户的所有订单,直到价格 <= 20 且状态='未付款'

    我认为通过提供以下示例可以更好地理解我的问题 我有一个包含以下数据的表 orderid Price username paymentstatus 1 10 john unpaid 2 10 john unpaid 4 10 john unp
  • 使用 Mock 对 Laravel 5 Mail 进行单元测试

    有没有办法在 Laravel 5 中测试 Mail 尝试了我在互联网上看到的唯一合法的模拟示例 但它似乎只适用于 Laravel 4 下面的当前代码 mock Mockery mock Swift Mailer this gt app ma
  • 为什么我的 PHP 脚本无法对其创建的文件进行 chmod?

    我有一个 php 创建一个需要可执行的文件 它是一个需要由系统运行的批处理文件 由于某种原因 即使该文件归 apache 所有并且 php 作为 apache 运行 并且创建了该文件 该脚本还是在 chmod 行处终止 我需要进行哪些不同配
  • 如何修改 Amazon RDS 实例的 my.ini 参数

    在启动 MySQL 5 5 RDS 实例时 Amazon 使用默认参数组来配置 my ini 参数 但控制台不允许我修改它们 我怎样才能实现这个目标 例如默认将存储引擎设置为MyISAM或设置字符集 此处记录了这一点 http aws am
  • MySQL 跨表计数(*) 查询帮助

    SELECT name COUNT AS count FROM t1 t2 WHERE t2 id t1 id GROUP BY t2 id 我想从 t1 获取名称以及 t2 中 id 与 t1 相同的行数 到目前为止我已经得到了上面的内容
  • 从 PHP 生成渐变颜色

    我想知道如何构建一个给出颜色代码和 显示该颜色的渐变 例如 function generate color int colorindex Generate 10 pale colors of this color 请帮我 迈克尔引用的代码相
  • 如何在php中根据url从mysql获取数据?

    我在 mysql 数据库中有一个页表 其中包含 page name title content author 字段 我想用 php 来获取它http www domain com index php page page name http
  • 使用数据库进行日志记录

    大多数日志似乎都是纯文本形式 而不是放入 MySQL 其他类型的数据库中 这是否有原因 在我看来 将它们放入数据库将使分析变得非常非常容易 但这会以牺牲速度还是其他什么为代价 我不太关心可移植性 显然你会有数据库连接的文本日志 我能想到两大
  • php无法在docker-compose中连接到mysql

    这是我的 docker compose version 2 services nginx image nginx 1 11 8 alpine ports 8081 80 volumes code usr share nginx html h
  • 检查一个类是否是另一个类的子类

    我想在不创建实例的情况下检查一个类是否是另一个类的子类 我有一个类 它接收类名作为参数 作为验证过程的一部分 我想检查它是否属于特定的类系列 以防止安全问题等 有什么好的方法可以做到这一点吗 is subclass of http php
  • PHPMailer 验证失败

    当我尝试在工作中使用 Windows Server 2012 上的 PHPMailer 来使用 SMTP 发送报告电子邮件时 出现身份验证失败错误 我在域上使用服务器管理员帐户 我非常确定密码是正确的 检查下面的代码 require PHP
  • 如何将“mysql source”命令与 mysql 变量一起使用?

    我需要从 mysql shell 执行一个基于如下条件的 SQL 文件 mysql gt 源 var 其中 var 包含文件名 这不可能 source是MySQL客户端程序在本地识别并执行的命令 变量存在于服务器上 因此客户端不知道什么 v
  • 警告:mysqli_query() 期望参数 1 为 mysqli,在 中给出 null

    我正在尝试构建一个简单的自定义 CMS 但出现错误 警告 mysqli query 期望参数 1 为 MySQLi 在中给出的为 null 为什么我会收到此错误 我的所有代码都已经是 MySQLi 并且我使用两个参数 而不是一个 con m
  • PHP 的 mb_internal_encoding 实际上是做什么的?

    根据 PHP 网站 http www php net manual en function mb internal encoding php它这样做 coding 是用于 HTTP 输入的字符编码名称 字符编码转换 HTTP输出字符编码 转
  • Oracle Blob 在 PHP 页面中作为 img src

    我有一个网站当前使用文件服务器上的图像 这些图像显示在页面上 用户可以根据需要拖放每个图像 这是使用 jQuery 完成的 图像包含在列表中 每张图片都非常标准 img src network path image png height 8
  • PHP:是否可以从文件内容(字符串)创建 SplFileObject 对象?

    例如 contents file get contents image png 是否可以从 contents 创建 SplFileObject 对象 Thanks php 有一些特殊的流包装器 http www php net manual
  • 一些基本的 PHP 问题 [已关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我只是有一些基本的 php 问题来加深我对学习的理解 但我找不到简单的答案 我有一个 php ajax 应用程序 它生成 mysql

随机推荐

  • 如何在 Python 中比较数组中的值 - 找出两个值是否相同

    我基本上有一个包含 50 个整数的数组 我需要找出这 50 个整数是否相等 如果相等 我需要执行一个操作 我该怎么做呢 据我所知 Python 中目前没有一个函数可以做到这一点 如果你的意思是你有一个列表并且你想知道是否有重复的值 那么从列
  • 并发、并行和异步方法有什么区别?

    并发是指两个任务在不同的线程上并行运行 但是 异步方法并行运行 但在同一个线程上 这是如何实现的 另外 并行性怎么样 这3个概念有什么区别 并发和并行实际上与您正确推测的原理相同 两者都与同时执行的任务有关 尽管我想说并行任务应该是真正的多
  • Wpf:在多个控件上应用自定义样式的工具提示

    我正在使用 WPF 应用程序 我创建了一个自定义控件库 在其中自定义了所有控件 这意味着添加了一些功能并重新设计了它们的样式 我也以同样的方式重新设计了工具提示 我在其他项目中使用这个自定义库 除了工具提示之外 一切都工作正常 工具提示样式
  • 如何使用两个按钮从 api 制作日期和时间列表水平视图,以通过颤动滚动列表视图

    我在颤振日期和时间页面视图中 当用户单击时间时 将单击的时间设置为灰色 并将其他时间设置为透明颜色 在此图片中您可以看到所选日期 https i stack imgur com jQ8dd jpg请注意 用户可以再次重新选择 以便旧的选择设
  • 如何转换 JToken

    我有一个值为 1234 的 JToken 如何将其转换为整数值 如 var totalDatas 1234 var tData jObject totalDatas int totalDatas 0 if tData null totalD
  • Pandas 中的plot 和iplot 有什么区别?

    在 Jupyter Notebook 中显示图形时 plot 和 iplot 有什么区别 我刚刚开始在 Python 3 6 6 中使用 iplot 我认为它使用了 Cufflinks 包装器来运行 Matplotlib 这似乎是我用简单的
  • MongoDB 数组 - 原子更新或推送元素

    我在 MongoDB 中有以下文档 id ObjectId 521aff65e4b06121b688fabc user abc servers name server1 cpu 4 memory 4 name server2 cpu 6 m
  • 如何在MVC单元测试类中模拟Request.Files[]?

    我想在 MVC 单元测试中测试控制器方法 为了测试我的控制器方法 我需要一个长度为 1 的 Request Files 集合 我想模拟 Request Files 因为我在控制器方法渲染的视图上使用了文件上传控件 任何人都可以建议我如何在单
  • 如何使用GD检查GIF是否具有透明度?

    我找到了问题如何使用GD检查图像是否具有透明度 https stackoverflow com q 5495275但答案都是针对 PNG 文件的 是否有解决方案可以使用 GD 扩展在 PHP 中检查 GIF 图像是否具有透明度 我假设 al
  • 依赖算法 - 找到要安装的最小软件包集

    我正在研究一种算法 其目标是找到安装包 X 的最小包集 我将通过一个例子更好地解释 X depends on A and E or C A depends on E and H or Y E depends on B and Z or Y
  • 打开新选项卡时使用 JSF 受保护视图时出错

    我已经设置了我的 Web 应用程序 通过在 faces config protected views 中列出各个页面来防止 CSRF 这在本地运行时效果很好 但在部署到服务器后 我最终在打开页面链接时收到这些错误 javax faces a
  • brew install python3 没有安装 pip3

    我使用 homebrew 安装了 python3 但它没有安装 pip3 或者我应该说它已安装但它无法识别该命令 这是我所做的 brew install python3 这安装了 python3 但最后抛出了一个错误 说它无法链接 pyth
  • 如何通过缓存制作离线地图(使用leaflet OSM)?

    我正在尝试通过浏览器中的缓存 IndexedDB 制作离线地图 我理解的概念是 当连接到互联网时 我首先下载并存储地图的图块 然后我必须逻辑上离线加载图块 但是 我无法弄清楚 如何存储它们以及如何逻辑地再次加载它们 我被困在这里了 我正在使
  • 为什么CameraX.bindToLifecycle在1.0.0-alpha05中不支持三种情况?

    我正在学习CameraX API CameraXBasic是一个office示例代码 代码A基于CameraFragment kt https github com android camera samples blob master Ca
  • 部署App Engine应用程序时如何设置自定义版本?

    我正在部署一个符合 Google 应用引擎标准的应用程序 这是一个 Java Kotlin 应用程序 但问题不一定是特定于此的 我正在使用最新的 Gradle 插件 答案可能是特定于此的 就像这些年来一样 我指定了一个项目 ID 比方说我的
  • 在 webpack 中传递环境相关变量

    我正在尝试将 Angular 应用程序从 gulp 转换为 webpack 在 gulp 中 我使用 gulp preprocess 来根据 NODE ENV 替换 html 页面中的一些变量 例如数据库名称 使用 webpack 实现类似
  • Python tkinter 树视图列大小

    我有一个Treeview in tkinter Linux 上的 Python 3 6 但 Windows 上也会发生同样的情况 我用它来模拟一种电子表格布局 我的问题是 如果我运行下面的示例代码 并调整 第 1 列 的大小 那么随着 第
  • 导出ipa文件失败

    使用 Xcode v11 3 我尝试导出 IPA 文件并收到此错误 导出期间发生错误 因此无法读取数据 格式不正确 这显示在 IDEDistribution standard log 中 System Library Frameworks
  • Cruise 与 TeamCity 与 CruiseControl.net [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 单例 PDO 模型 - 层次结构

    抱歉英语不好 我是巴西人 更糟糕的是谈论编程 我们走吧 我有这个 class DataBase extends PDO var object PDO private static instance Cria uma inst ncia do