php构造方法为什么会出现这个错误呢?

class Singleton{
    protected function __construct()
    {
        echo 2;
    }
}
$test = new Singleton();

Fatal error: Call to protected Singleton::__construct() from invalid context
Fatal error: Call to private Singleton::__construct() from invalid context

必须要用public才行,protected & private 都会出现这个问题。

阅读 5.7k
6 个回答

只有public修饰的方法才可以在类的外部访问,protected方法和private方法只能在类中访问,区别在与protected方法可以在子类中访问而private方法不可以。

一般情况下构造函数都是public的,这样就可以在类的外部通过 new ClassName() 的方式实例化类。

如果构造函数是private或者protected修饰的,此时一般用来实现单例模式,具体代码如下:

class ClassName {
    static $instance;
    
    private function __construct(){}
    
    public static function getInstance() {
        if (static::$instance instanceof static) {
            return static::$instance;
        }
        
        return static::$instance = new static();
    }
}

你是不是在别的地方调用Singleton这个类了,并且还实例化,才出现的这个错误!

构造方法也和普通方法一样,遵循访问控制的规则。new的时候,会自动调用构造方法。但是 $test = new Singleton();是在类外部调用的,当然不行咯。

补充一下,构造方法的可见性是根据自己的需求来定义的。并不是说不能用private 或者protected。比如题主明显是为了实现单例模式,那么这时候构造函数就只能用private,达到防止被外部实例化的目的。而protected是可以被子类访问的。

protected 或者 private 会导致这个类无法被实例化

__construct是构造函数,构造函数是在实例对象后立即运行的,是在类外运行了!所以声明为private及protected时,再实例对象就出错了!

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题