Fatal error: Call to private MyObject::__construct() from invalid context
在PHP中创建新对象时,我收到以下错误消息:Fatal error: Call to private MyObject::__construct() from invalid context我只是创建新对象,不尝试显式调用构造函数。有人知道发生了什么事吗?
您的MyObject类有一个受保护的或私有的构造函数,这意味着类不能被实例化。当一个对象被实例化时,总是调用__construct()函数,因此尝试执行$x = new MyObject()之类的操作将导致私有构造函数出现致命错误。(如果没有特别声明__construct()函数,将调用父构造函数)。
私有构造函数通常用于单例类中,以防止直接实例化对象。如果它不是您构建的类,那么它可能有一个可用的getInstance()函数(或类似的函数)来返回它自己的实例。
- 这很有效,我想我以前见过有人声明私有构造函数。有什么理由这么做吗?
- 唯一的原因是,如果您不希望类由于某种原因被实例化。正如我在答案中提到的,单件模式是一个流行的原因,你可以这样做(en.wikipedia.org/wiki/singleton-u模式)。
- 私有构造函数通常由单例模式的PHP实现使用,有时与工厂一起使用。例如,类的工厂静态方法可以搜索对象的本地缓存实例,并返回引用而不是新对象。将构造函数设为私有将防止工厂方法的任何意外绕过。
- 那么,解决方案是什么?
- singleton不是拥有私有构造函数的唯一原因。有时,通过将构造函数设为私有并创建一个或多个命名构造函数来禁用它是很好的,这可以通过创建一个公共静态方法来实现,该方法初始化一个实例并返回它。
对我来说,就是类的名称与其中一个方法的名称相同那是私人的…
例如。。。
1 2 3 4 5 6 7 8 9 10
| class myClass {
public function __construct() {
}
private function myClass() {
}
} |
你可以用$x = new MyObject()代替$x = new MyObject()。
1
| $x = MyObject::getInstance(); |
假设MyObject是一个单体,getInstance()函数可用。