除非我删除它的构造函数

时间:2015-08-23 20:43:33

标签: php oop

这是我在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();

我做错了什么? 如果我在父页面和子类中删除构造函数,那么最小页面渲染。

2 个答案:

答案 0 :(得分:3)

New未声明构造函数。这意味着它从基类继承构造函数。但是基类的构造函数是private,并且它将其用法限制为其类的方法。

解决方案是将类Pages的构造函数声明为protected。这样它就可以通过派生类的方法调用。

更多,如果一个类未声明为final(这会阻止扩展它),那么它不能将其构造函数声明为private。使构造函数私有可以防止子类的构造函数调用它,这使得基类的属性未初始化(即,未正确构造派生类的对象)。

将构造函数声明为private是一种不好的做法。它需要一个类的静态方法作为该类对象的工厂(在您的情况下为方法getInstance()),这使得类很难测试,并且不可能在测试中用模拟替换。

答案 1 :(得分:0)

我想你的新班级意味着

self::$oInstance = new New( );