奇怪的麻烦。我已经多次使用过单身,但这个特殊情况只是不想工作。转储表示该实例为空。
define('ROOT', "/");
define('INC', 'includes/');
define('CLS', 'classes/');
require_once(CLS.'Core/Core.class.php');
$core = Core::getInstance();
var_dump($core->instance);
$core->settings(INC.'config.php');
$core->go();
核心课程
class Core
{
static $instance;
public $db;
public $created = false;
private function __construct()
{
$this->created = true;
}
static function getInstance()
{
if(!self::$instance) {
self::$instance = new Core();
} else {
return self::$instance;
}
}
public function settings($path = null)
{
...
}
public function go()
{
...
}
}
错误代码
Fatal error: Call to a member function settings() on a non-object in path
这可能是一些愚蠢的错字,但我的编辑器中没有任何错误。感谢您一如既往的快速反应。
答案 0 :(得分:9)
您需要始终从单例方法返回单例对象,这不是因为您有else
语句,因此getInstance
的第一次调用不会返回任何内容:
static function getInstance()
{
if(!self::$instance) {
self::$instance = new Core();
} else {
return self::$instance;
}
}
您的单例方法应如下所示:
static function getInstance()
{
if(!self::$instance) {
self::$instance = new Core();
}
return self::$instance;
}
此外,拥有一个表示对象是否已创建的实例变量几乎没用,因为您只需比较if(self::$instance !== NULL)
就可以了。
答案 1 :(得分:2)
getInstance 总是返回一个值 - 需要像这样改变:
static function getInstance()
{
if(!self::$instance) {
self::$instance = new Core();
}
return self::$instance;
}
答案 2 :(得分:0)
除了需要将getInstance()方法更改为:
static function getInstance() {
if(!self::$instance) {
self::$instance = new Core();
}
return self::$instance;
}
...您还试图在以下调用中从实例本身取消引用$ instance:
var_dump($core->instance);
您应该检查:
var_dump($core);
或
var_dump(Core::$instance);
...在$ core = Core :: getInstance()调用之后,应该是同一个对象。