所以在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中执行此操作的最佳方法是什么?
答案 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的经典读物,它可能会帮助您更好地识别和重新考虑您的单身人士需求: