2016-03-29 13 views
0

In meiner Anwendung ich so etwas wie die folgendenInstanceof Kohlenstoff versagt

if($val instanceof Carbon) 
... 

leider nur verwenden, wenn ich vorher Carbon im Code verwenden (auch wenn nur Carbon::now();) wird es immer false zurück. Warum?

+1

Nicht Sicher verstehe ich ... Wie könnte "$ val" zu diesem Zeitpunkt eine Instanz von Carbon sein, wenn Sie die Bibliothek nicht früher benutzt haben? (In jedem Fall haben Sie wahrscheinlich eine Klasse Auto-Loader.) –

+0

Können Sie den vollständigen Code zur Verfügung stellen? – tommy

+7

Der vollständige Namensraum der 'Carbon' Klasse ist' Carbon \ Carbon', also sollte der Check 'if ($ val instanceof Carbon \ Carbon) sein'. Oder wenn Sie nur nach dem Klassennamen suchen möchten, verwenden Sie am oberen Ende der Datei 'carbon \ Carbon;' und dann '$ val instanceof Carbon'. – Bogdan

Antwort

3

Sie verwenden Laravels Klasse Auto-Loader. Sie haben dies bei config/app.php definiert:

'Carbon' => Carbon\Carbon::class, 

... also, wenn Sie laufen diese zum ersten Mal: ​​

Carbon::now(); 

... benötigt PHP eine Carbon Klasse, die noch nicht so Klasse definiert ist Autoloading wird ausgelöst und Laravel lädt den Namespace Carbon\Carbon und definiert einen Carbon Alias. Somit kann $val instanceof Carbontrue zurückgeben, wenn die Variable den richtigen Typ hat.

instanceof selbst wird jedoch keine Klasse automatisch laden auslösen. Documentation schlägt vor, es tut, dass in der Vergangenheit, aber es nicht mehr tut:

Bevor PHP-Version 5.1.0, instanceof nennen würde __autoload(), wenn der Klassenname nicht existiert.

Demo

(ich gebe zu ich noch nicht über eine Erklärung, wie Sie können $val eine Instanz von Kohlenstoff machen, wenn Sie nicht die Klasse noch geladen haben.)