在对象自己的类中实例化对象


Instantiating an object within its own class

我试图弄清楚是否可以在自己的构造函数中实例化一个类,结果发现:

为什么可以在类的定义中实例化它?。

然后我在PHP中尝试了同样的东西:

Class someClass {
 function __construct() {
  $objNew = new someClass();
  $objNew->doit();
 }
  function doit() {
   echo "Do it man!'n";
  }
}
$oNew = new someClass();

每次我尝试运行这个程序时,我都会出现"分段故障"错误。。。。。参考上面的代码,甚至上面发布的链接,我想在自己的构造函数中实例化一个类会导致创建无限多的对象(当然,直到服务器崩溃!)。。。。。对上面发生的事情有什么想法吗?为什么在Java中这样做是可以的,而(也许)在PHP中不可以?

这不是一回事。关于为什么可以在类的定义中实例化类的问题?,使用静态方法来实例化他的类。静态方法与类定义(如蓝图)一起存储在堆内存中,不需要实例化。

你可以创建一个静态方法,这个方法必须创建你的类的一个新实例:

Class someClass {
  function __construct() {
    $this->doit();
  }
  static function createSomeClass() {
    return new someClass();
  } 
  function doit() {
    echo "Do it man!'n";
  }
}
$oNew = someClass::createSomeClass();

Php不是编译的,而是解释的。编译Java,然后执行。因此,类本身还没有完全定义,您可以在php中再次调用它,所以这会引发一个错误。

以下是适合您的解决方案

<?php
Class someClass {
 function __construct() {
  $this->doit();
 }
  function doit() {
   echo "Do it man!'n";
  }
}
$oNew = new someClass();
?>

如果您只想在对象实例化时调用该方法。那么,做这个$objNew = new someClass();就没有意义了。它没用。简单地说,这样做:

class someClass {
  function __construct() {
    $this->doit();
  }
  function doit() {
   echo "Do it man!'n";
  }
}
$oNew = new someClass();