使用php 7.0运行的单例数据库类的继承问题

时间:2015-12-22 12:19:18

标签: php oop inheritance singleton

所以在php 5. *版本中,我会将构造函数设置为私有,然后只获取它的实例,并且运行良好,内存使用率很低。

class bsdb extends mysqli {

    private $host = '';
    private $account = '';
    private $password = '';
    private $database = '';

    private static $instance;
    private function __construct(){

        try {

            parent::__construct($this->host, $this->account, $this->password, $this->database);
            parent::set_charset('utf8');

        } catch (mysqli_sql_exception $e) {

            log(sprintf("Connect failed: %s\n", mysqli_connect_error()), 'sql');
            die('DB Connection error');

        }
    }

    static function instance() {

        if (!self::$instance)
                self::$instance = new bsdb;

            return self::$instance;
    }
}

但是在php7中我不再能够这样做,因为如果我继承自具有公共构造函数的类,那么php的第7版不允许我使构造函数私有化。它给我一个错误。

所以我的问题是在新版本的php中执行此操作的最佳方法是什么?

1 个答案:

答案 0 :(得分:3)

在您的问题中,您可以将此问题的根源描述为:

  

但是在php7中我不再能够这样做,因为如果我继承自具有公共构造函数的类,那么php的第7版不允许我使构造函数私有化。它给我一个错误。

正确的说法是,PHP 7会给你一个类似于以下内容的致命错误,其中 Bar 私有ctor从 Foo 延伸到公开的

  

致命错误:Bar :: __ construct()的访问级别必须是公共的(如在Foo类中)

但是你会产生错误的印象,认为这应该在PHP 5中起作用,并且仅在PHP 7之后才被禁止。请放心,情况并非如此。

PHP 5中引入了对方法(包括构造函数方法)的可见性,并且自第一个PHP 5发布以来,您会收到致命错误。立即查看许多不支持的PHP版本:https://3v4l.org/pfcBm

由于可见性是自版本5以来语言的一部分,我看不出这是一个PHP 7问题,但只适用于非常具体的类mysqli

但是,您不需要将ctor设为私有。您只需要单个实例,而不是单例模式的实现。快速解决方法是将ctor公开,只需使用`home@home:/usr/local/share$ which npm /usr/bin/npm home@home:/usr/local/share$ which node /usr/bin/node home@home:/usr/local/share$ pwd /usr/local/share home@home:/usr/local/share$ cd npm bash: cd: npm: No such file or directory home@home:/usr/local/share$ sudo npm install -g bower npm http GET https://registry.npmjs.org/bower npm ERR! Error: failed to fetch from registry: bower npm ERR! at /usr/share/npm/lib/utils/npm-registry-client/get.js:139:12 npm ERR! at cb (/usr/share/npm/lib/utils/npm-registry-client/request.js:31:9) npm ERR! at Request._callback (/usr/share/npm/lib/utils/npm-registry-client/request.js:136:18) npm ERR! at Request.callback (/usr/lib/nodejs/request/main.js:119:22) npm ERR! at Request.<anonymous> (/usr/lib/nodejs/request/main.js:212:58) npm ERR! at Request.emit (events.js:88:20) npm ERR! at ClientRequest.<anonymous> (/usr/lib/nodejs/request/main.js:412:12) npm ERR! at ClientRequest.emit (events.js:67:17) npm ERR! at HTTPParser.onIncoming (http.js:1261:11) npm ERR! at HTTPParser.onHeadersComplete (http.js:102:31) npm ERR! You may report this log at: npm ERR! <http://bugs.debian.org/npm> npm ERR! or use npm ERR! reportbug --attach /usr/local/share/npm-debug.log npm npm ERR! npm ERR! System Linux 3.2.0-96-generic-pae npm ERR! command "node" "/usr/bin/npm" "install" "-g" "bower" npm ERR! cwd /usr/local/share npm ERR! node -v v0.6.12 npm ERR! npm -v 1.1.4 npm ERR! message failed to fetch from registry: bower npm ERR! npm ERR! Additional logging details can be found in: npm ERR! /usr/local/share/npm-debug.log npm not ok 全局静态方法来获取特定的bsdb实例。从问题中可见的内容来看,该类的主要职责是管理全局静态方法中的全局变量,并使数据库配置属性具有常量值。

我通常认为你提出的课程一次性太多(实例创建和生命周期管理,数据库配置处理以及最后但并非最不重要的是 mysqli )在变化的时候,这通常是一种负担,而且通常只有这一点就是一个很好的例子,为什么你应该把事情分开,不属于一个人。

这是关于stackoverflow的经典读物,它可能会帮助您更好地识别和重新考虑您的单身人士需求: