2013-07-16 15 views
13

Ben kodu aşağı yukarı böyle vardır:Fabrikalar için PhpStorm tipi imalama?

class Foo { 
    public static function factory($str) { 
     $class = "Foo_" . $str; 
     return new $class; 
    } 
} 
class Foo_Bar { 
    public function razzle() { 
     print "Foo_Bar->baz() was called"; 
    } 
} 

$Obj = Foo::factory('Bar'); 

ve ben PhpStorm örneğin ben $Obj->raz, razzle() otomatik tamamlanması için görünecektir yazarsanız böylece $Obj, bir Foo_Bar nesne olduğunu anlamak istiyorum.

Bunu elde etmenin bir yolu var mı? PhpStorm'a Foo::factory($str) işlevinin Foo_$str türünde bir nesne döndürdüğünü anlatmak için? Benim tahminim cevabın hayır olmasıdır.

cevap

5

Evet, yapabilirsiniz sizin fabrika statik yöntem ise. Sağladığınız örnekler için iyi çalışmalı.

fazla detay ve bazı temel örnek burada bulunabilir: http://confluence.jetbrains.com/display/PhpStorm/PhpStorm+Advanced+Metadata

+0

Belki de yanlış bir şey yapıyorum, ancak benim için çalışmıyor gibi görünüyor. PhpStorm 6.0.3 kullanıyorum. Aşağıdaki iki dosyayı yeni bir boş projede oluşturdum: http://pastie.org/8146899, ama ben herhangi bir otomatik tamamlama '' $ x -> ... ' –

+1

benim için çalışmıyorum. 1) Meta veri dosyası ile dosyalanması gerekmektedir. .phpstorm.meta.php'; 2) Anında toplanmayacak - projeyi kapatıp yeniden açacak (bu tür bir dosya proje yükü üzerinde yapılır, bir kez dosya bulunduğunda, derhal değiştirilmelidir) - bu davranış v7. – LazyOne

+0

Teşekkürler! İsmin gerekli olduğunu anlamadım, şimdi güzelce çalışıyor. –

12

Bildiğim kadarıyla, PHPStorm'un Foo'nun ne verdiğini anlamasını sağlayamıyorsunuz, çünkü bu dinamik. Ancak mutlaka sizin $ Obj değişken şöyle, üzerinde bir doc yorumunu koyarak, ne PhpStorm söyleyebilir:

/** @var Foo_Bar $Obj */ 
$Obj = Foo::factory('Bar'); 
+1

Bu, PhpStorm'un $ Obj'nin veri tipini bilmesini sağlar, ancak istediğim, PhpStorm'un Foo :: factory() döndürme veri türünü bilmesidir. - PhpDoc @ var'ın her fabrikayı kullandığımda istemiyorum. sadece çirkin bir hack. LazyOne'un cevabı umut vericiydi, ama işe yaramayacak gibi görünmüyor; Bir adımı kaçırdığımı sanmıyorum. –

+1

@ hobbit.trap * "Bu sadece çirkin bir hack" * - değil. PHPDoc'un kendisinin dinamik dönüş tipi sağlama mekanizması yoktur (gerçek dizi parametresinden derleme). Eğer gerçek Doc standardında değilse (kod ipucu için kullanılır), neden bunun sihirli bir şekilde çalışmasını bekliyorsunuz? – LazyOne

+0

@LazyOne Dikkat ederseniz, PHPDoc'un bu mekanizmaya yerleşik değil. Kesinlikle herhangi bir PHPDoc tabanlı çözüm, mutlaka, bir kesmek olacaktır. Ama bir PHPDoc çözümü aramıyordum, herhangi bir PhpStorm çözümü arıyordum - yukarıda sağladığınız, çok teşekkürler! –

1

Sen dinamik ve statik aramalar için çalışır PhpStorm meta, kullanmalıdır.

class Foo { 
    public function factory($str) { 
     $class = "Foo_" . $str; 
     return new $class(); 
    } 
} 
class Foo_Bar { 
    public function baz() { 
     print "Foo_Bar->baz() was called"; 
    } 
} 

$Obj = Foo->factory('Bar'); 
$Obj->baz(); 

proje kök dizininde bir dosya oluşturmak ve bu .phpstorm.meta.php isim:

<?php 

namespace PHPSTORM_META { 
    $STATIC_METHOD_TYPES = [ 
     \Foo::factory('') => [ 
      "Bar" instanceof \Foo_Bar, 
     ], 
    ]; 
} 

teşekkür @LazyOne bağlantıdan.