构造函数不可以私有化吗?

这个为什么会报错?

<?php
class A{
  public $a=2;
  private function __construct(){
      $this->a=4;
  }
}
$obj =new A();
echo $obj->a;
阅读 7.4k
4 个回答

构造函数私有化后,不能再使用 new 外部调用,私有方法只能类内部使用。

可以这样:

<?php
class A {
  public $a = 2;

  private function __construct(){
      $this->a=4;
  }

  public static function createInstance() {
      return new A();
  }
}

$obj = A::createInstance();

类中的方法修饰符没有限制,修饰符是在非类内部直接调用时生效,private 只能在类内部访问,实例化对象(new)的时候,会调用构造方法,但调用时发现构造方法修饰符为 private,不能在外部直接访问,所以报错,如果构造方法被私有化(private),就不能再使用 new 关键字,需要在类中写一个静态方法,因为静态方法调用不会走构造方法,再在静态方法中调用构造函数即可,此过程为“单例模式”的核心逻辑

可以私有,私有后不能在类以外用new创建。

<?php
class A{
  public $a=2;
  private function __construct(){
      $this->a=4;
  }
  public static function newA() {
      return new A(); // new static;
  }
}
$obj = A::newA();
echo $obj->a;
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题