Php 除非移除类的构造函数,否则无法扩展类

Php 除非移除类的构造函数,否则无法扩展类,php,oop,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

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

}
};
我想创建扩展
页面的类
,以利用其属性和方法:

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
}
};
然而,当我尝试初始化对象时,php只生成空白页面(即使没有错误)

我做错了什么?
若我从父类和子类中移除构造函数,至少页面呈现。

我想在你们的新类中,你们的意思是

self::$oInstance = new New( );

我想在你的新课上你是说

self::$oInstance = new New( );

我想在你的新课上你是说

self::$oInstance = new New( );

我想在你的新课上你是说

self::$oInstance = new New( );

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

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

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


将构造函数声明为
private
是一种糟糕的做法。它需要有一个类的静态方法作为该类对象的工厂(在您的例子中是方法
getInstance()
),这使得该类很难测试,也不可能在测试中替换为模拟类。

New
没有声明构造函数。这意味着它从基类继承构造函数。但是基类的构造函数是,这将其使用限制在其类的方法上

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

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


将构造函数声明为
private
是一种糟糕的做法。它需要有一个类的静态方法作为该类对象的工厂(在您的例子中是方法
getInstance()
),这使得该类很难测试,也不可能在测试中替换为模拟类。

New
没有声明构造函数。这意味着它从基类继承构造函数。但是基类的构造函数是,这将其使用限制在其类的方法上

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

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


将构造函数声明为
private
是一种糟糕的做法。它需要有一个类的静态方法作为该类对象的工厂(在您的例子中是方法
getInstance()
),这使得该类很难测试,也不可能在测试中替换为模拟类。

New
没有声明构造函数。这意味着它从基类继承构造函数。但是基类的构造函数是,这将其使用限制在其类的方法上

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

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


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

请阅读以下内容:尝试将构造函数更改为受保护的方法,而不是私有方法。子类不能使用私有方法。请阅读以下内容:尝试将构造函数更改为受保护的方法,而不是私有方法。子类不能使用私有方法。请阅读以下内容:尝试将构造函数更改为受保护的方法,而不是私有方法。子类不能使用私有方法。请阅读以下内容:尝试将构造函数更改为受保护的方法,而不是私有方法。子类不能使用私有方法。是的,忘了更改它。是的,我认为这就是问题和解决方案。请更新你的问题,我删除我的答案。是的,忘了更改这个。是的,我认为这就是问题和解决方案。请更新你的问题,我删除我的答案。是的,忘了更改这个。是的,我认为这就是问题和解决方案。请更新你的问题,我删除我的答案。是的,忘了更改这个。是的,我认为这就是问题和解决方案。请更新您的问题,我删除我的答案。