class - php构造方法为什么会出现这个错误呢?
巴扎黑
巴扎黑 2017-04-11 09:09:57
[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 都会出现这个问题。

巴扎黑
巴扎黑

全部回复(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();
    }
}
ringa_lee

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

阿神

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

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

迷茫

楼主,类的构造方法不能使用proceted的哦,想知道结果,看看下面的代码再运行看试试

https://www.bytelang.com/o/s/...

黄舟

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

PHPz

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号