2016-05-04 6 views
0

Ich habe eine Klasse Resource aber mit einem voll qualifizierten Namen wie com.example/objects/ResourcePHPDoc Type Hinting überlappende Typen

genannt Wenn ich eine Datei

use com.example/objects/Resource; 

/** 
* Do something 
* 
* @param Resource $r 
*/ 
function myfunc(Resource $r) { 
    $r->something(); 
} 

$x = new Resource(); 
myfunc($x); 

Dann fein funktioniert alles schreiben. Wegen meiner use Aussage ist das PHP typehinting der Lage, die die Tatsache umgehen, dass ich eine Variable vom Typ bestanden habe com.example/objects/Resource obwohl myfunc nur den Vergleich gegen Resource

Das Problem ist, dass PhpStorm nicht in der Lage ist, dies zu umgehen. Ich kann die automatische Vervollständigung nicht verwenden und erhalte eine Warnung an myfunc($x), die Expected Resource, got Resource und eine Warnung innerhalb der Funktion sagt, die Method 'something' not found in the class Resource sagt. Offensichtlich geht PHPSstorm davon aus, dass ich die eingebaute Klasse resource und nicht meine eigene Klasse Resource verwende.

Wenn ich die PHPDoc und die Funktionsdefinition ändern, um den voll qualifizierten Namen zu verwenden, gehen die vorherigen Warnungen weg, aber ich bekomme eine kleine Warnung, die besagt Unnecessary fully qualified name. Ich nehme an, eine Lösung wäre, den voll qualifizierten Namen zu verwenden und die kleine Warnung, aber ich würde lieber nicht vollständig qualifizierte Namen überall verwenden müssen. Ich weiß, dass es meine eigene Schuld ist, eine Klasse zu erstellen, die den gleichen Namen wie ein eingebauter Typ hat, aber ich frage mich, ob es trotzdem etwas gibt, damit das funktioniert? Abgesehen von der Umbenennung meiner Resource Klasse?

+0

Verwenden Sie Alias. z.B. 'Verwenden Sie com.example/objects/Resource als MyResource;' – LazyOne

+1

verwenden Sie "\" anstelle von "/" in Namespaces ^^. –

Antwort

2

Sie können beim Importieren der Klasse entweder alias verwenden. Weitere Informationen finden Sie unter here. Beispiel:

use com.example\objects\Resource as MyResource; 

/** 
* Do something 
* 
* @param MyResource $r 
*/ 
function myfunc(MyResource $r) { 
    $r->something(); 
} 

$x = new MyResource(); 
myfunc($x); 

Sie können auch den gesamten Namespace und Klassennamen anstelle des Namens nur die Klasse angeben. Beispiel:

/** 
* Do something 
* 
* @param com.example\objects\Resource $r 
*/ 
function myfunc(com.example\objects\Resource $r) { 
    $r->something(); 
} 

$x = new com.example\objects\Resource(); 
myfunc($x); 

Wenn Sie in einem Namespace sind und diesen Ansatz verwenden, stellen Sie sicher, dass ein führendes \ auf Ihrem vollständigen Klassennamen Bezeichner (z $x = new \com.example\objects\Resource();) zu verwenden.

Verwandte Themen