PHP——如果构造函数有长时间运行的作业,是否会创建实例


PHP -- Will the instance get created if the constructor has a long running job?

我得到了一个类构造函数,它启动一个curl_multi并下载一定数量的文件,需要几秒钟才能完成。对象实例是否仅在构造函数完成下载后才创建?

class Downloader {
  public function __construct($download_links_array,...) {
     $handle = new curl_multi_init();
     ...
  }
}
$downloader = new Downloader( array($download_links) );
$downloader->get_item(10); // Will this be too early to call?

所以问题是实例是否在调用get_item()之前被创建,或者它将控制只在实例(即,所有下载完成)被创建后返回?

谢谢!

看情况。你如何下载文件?同步还是不同步?如果是同步的,那么执行下载的函数调用将不会返回,直到文件下载完成。否则,该函数将立即返回,文件将在后台下载(通常您需要提供一个回调函数来处理在异步工作时完成下载的事件)。

而且,只要构造函数没有完成它的工作,对象就不被认为是准备好的。这意味着,new调用将不会返回,直到对象准备好,即构造函数完成。

结合上面的两个部分告诉我们,如果下载是同步完成的,对象只有在下载完成后才准备好,因此get_item的调用将在所有下载完成后才执行。然而,如果你异步下载你的文件,那么对象将准备好,不管你的下载何时完成,get_item的调用可能会在你的下载完成之前执行。

你可以阅读这个答案,它可能会让你更好地理解两者之间的区别(因为他们讨论了一个非常简单的例子,执行一个查询可能需要很长时间,而不是下载文件)。

注意:构造函数实际上不需要执行这些任务。