2016-06-30 8 views
0

Ich habe einen Klassenkonstruktor, der ein curl_multi startet und eine bestimmte Anzahl von Dateien herunterlädt und einige Sekunden braucht, um sie abzuschließen. Wird die Objektinstanz erst erstellt, nachdem der Konstruktor mit den Downloads fertig ist?PHP - Wird die Instanz erstellt, wenn der Konstruktor einen langen Job hat?

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? 

So wird die Frage wird die Instanz vor dem Aufruf get_item erstellt get() oder es wird die Steuerung erst nach der Instanz (dh alle Downloads abgeschlossen sind) erstellt zurückgegeben werden?

Danke!

+0

einfachste Antwort. Hast du es versucht und was ist passiert? – Matt

+1

Konstruktoren sollten solche Aufgaben nicht ausführen ... – FirstOne

+0

Es ist mir nicht klar, wenn die Downloads abgeschlossen wurden, aber ich habe keine Fehler erhalten. – user2727704

Antwort

0

Kommt drauf an. Wie laden Sie Ihre Dateien herunter? synchron oder nicht? Wenn Sie dies synchron tun, wird Ihr Aufruf der Funktion, die den Download ausführt, erst zurückkommen, wenn die Dateien heruntergeladen sind. Andernfalls wird die Funktion sofort zurückkehren und Ihre Dateien werden im Hintergrund heruntergeladen (normalerweise müssen Sie eine Callback-Funktion bereitstellen, die das Beenden der Downloads bei asynchronem Arbeiten übernimmt).

Darüber hinaus wird ein Objekt nicht als bereit betrachtet, solange der Konstruktor seine Arbeit nicht beendet hat. Das bedeutet, dass der Aufruf new erst zurückkehrt, wenn das Objekt fertig ist, d. H. Der Konstruktor ist fertig.

Die Kombination der beiden obigen Abschnitte lehrt uns, dass, wenn das Herunterladen synchron erfolgt, das Objekt erst fertig ist, nachdem die Downloads beendet sind, so dass der Aufruf von get_item erst ausgeführt wird, wenn alle Downloads beendet sind. Wenn Sie Ihre Dateien jedoch asynchron herunterladen, ist das Objekt unabhängig davon, wann Ihre Downloads abgeschlossen sind, bereit, und der Aufruf für get_item wird möglicherweise ausgeführt, noch bevor Ihre Downloads abgeschlossen sind.

Sie können lesen this answer, die Ihnen möglicherweise ein besseres Verständnis über den Unterschied zwischen den beiden (wie sie diskutieren ein sehr einfaches Beispiel für die Ausführung einer Abfrage, die eine lange Zeit statt Download-Dateien dauern kann).

Hinweis: Konstruktoren müssen solche Aufgaben wirklich nicht ausführen.