Php 除非移除类的构造函数,否则无法扩展类
这是我在OOP php中的第一步 我的CMS里有这个课程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
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()
),这使得该类很难测试,也不可能在测试中替换为模拟方法。请阅读以下内容:尝试将构造函数更改为受保护的方法,而不是私有方法。子类不能使用私有方法。请阅读以下内容:尝试将构造函数更改为受保护的方法,而不是私有方法。子类不能使用私有方法。请阅读以下内容:尝试将构造函数更改为受保护的方法,而不是私有方法。子类不能使用私有方法。请阅读以下内容:尝试将构造函数更改为受保护的方法,而不是私有方法。子类不能使用私有方法。是的,忘了更改它。是的,我认为这就是问题和解决方案。请更新你的问题,我删除我的答案。是的,忘了更改这个。是的,我认为这就是问题和解决方案。请更新你的问题,我删除我的答案。是的,忘了更改这个。是的,我认为这就是问题和解决方案。请更新你的问题,我删除我的答案。是的,忘了更改这个。是的,我认为这就是问题和解决方案。请更新您的问题,我删除我的答案。