这是我在OOP php中的第一步。
我的CMS中有这个课程。
class Pages
{
private static $oInstance = null;
public static function getInstance( ){
if( !isset( self::$oInstance ) ){
self::$oInstance = new Pages( );
}
return self::$oInstance;
} // end function getInstance
/**
* Constructor
* @return void
*/
private function __construct( ){
$this->generateCache( );
} // end function __construct
/**
* Generates cache variables
* @return void
*/
public function generateCache( ){
//some more code
}
};
我想创建扩展Pages
的类来使用它的属性和方法:
class New extends Pages{
private static $oInstance = null;
public static function getInstance( ){
if( !isset( self::$oInstance ) ){
self::$oInstance = new Ajax( );
}
return self::$oInstance;
}
public function newmethod(){
//some logic
}
};
然而,当我尝试初始化Object时,php只生成空白页面(即使没有错误)。
$object = New::getInstance( );
或
$object = new New();
我做错了什么? 如果我在父页面和子类中删除构造函数,那么最小页面渲染。
答案 0 :(得分:3)
类New
未声明构造函数。这意味着它从基类继承构造函数。但是基类的构造函数是private
,并且它将其用法限制为其类的方法。
解决方案是将类Pages
的构造函数声明为protected
。这样它就可以通过派生类的方法调用。
更多,如果一个类未声明为final
(这会阻止扩展它),那么它不能将其构造函数声明为private
。使构造函数私有可以防止子类的构造函数调用它,这使得基类的属性未初始化(即,未正确构造派生类的对象)。
将构造函数声明为private
是一种不好的做法。它需要一个类的静态方法作为该类对象的工厂(在您的情况下为方法getInstance()
),这使得类很难测试,并且不可能在测试中用模拟替换。
答案 1 :(得分:0)
我想你的新班级意味着
self::$oInstance = new New( );