2015-03-16 11 views
5

sınıf değişkenleri miras : Ben $this değil $this->geometry tip ima sanki bu işe yaramazsaTypehint ben yazdıkça-ipucu olabilir bir değişken bu şekilde, PhpStorm yılında PhpStorm

class PointProxy extends Proxy 
{ 
    public function x() 
    { 
     ... 

     /** @var Point $this->geometry */ 
     return $this->geometry->x(); 
    } 
} 

, PhpStorm davranır.

alt sınıfta yılında $geometry özelliğini redeclaring olmadan böyle bir tip ipucu çalışması yapmanın bir yolu var mı veya bu desteklenmiyor?

+1

Böyle bir PHPDoc'u karmaşık (ikinci düzey hiyerarşi) nesneleri için kullanamazsınız - yalnızca birinci düzey. Bu '/ ** @var Noktası $ this-> geometri * /' anlamsızdır. PHPDoc yorumu ilk seviyeye (“bu durumda $ this”) uygulanacaktır. Şu anda, sınıf için PHPDoc yorumunda '@ property' aracılığıyla bildirmeyi deneyebilirsiniz - yalnızca bir kamu malı ve özel/korumalı değilse anlamlı olmalıdır. – LazyOne

+0

Mümkünse, özellik ana sınıfta yazılmalıdır; Bu çocuk sınıflarına yayılmalıdır. – deceze

+1

@deceze It *, * sınıfında, "Geometry" şeklinde yazılmıştır. Çocuk sınıfı aslında 'Geometri'nin soyundan gelen bir' Point 'olduğunu belgelemelidir. – Benjamin

cevap

3

Bu kodu deneyin. Ayrıca, undefined özelliklerinde alt+enter tuşlarına basabilir ve Add @property seçeneğini seçerek phpdoc'u daha hızlı oluşturmanıza yardımcı olacaktır.

/** 
* @property Point $geometry 
*/ 
class PointProxy extends Proxy { 
    public function x() { 
    return $this->geometry-> 
    } 
} 
üst nesne türleri varsa

add property completion

+0

@LazyOne tarafından belirtildiği gibi, '@ property' ile ilgili sorun, buradaki durumun 'public' olarak kabul edilmesi ve karışıklık getirmesidir! – Benjamin

+0

Bu özellik sanal ve dinamikse ('__get' ile erişiriz) - gerçekte "public" dir. Eğer bunu "korumalı" ya da "özel" yapmak istiyorsanız bunu sınıfta ilan edin. – funivan

+1

Bu * ana sınıfta * korunmaktadır! – Benjamin

0

Geometri olarak emlak ancak bunu çocuğunuzun sınıfta (Geometri iner) Nokta olarak yazdığınız istiyorum, içinde bir erişimci oluşturarak öneriyoruz senin çocuk sınıfı Muhtemelen bazı tip kontrolleri ile.

class PointProxy extends Proxy 
{ 
    /** 
    * Access the geometry object on parent class as a Point 
    * 
    * @return Point 
    */ 
    private point() 
    { 
     if(!is_a($this->geometry, 'Point')) 
     { 
      // Log an error or something, this is not a state we should be in 
     } 
     else 
     { 
      return $this->geometry; 
     } 
    } 

    public function x() 
    { 
    ... 

     return $this->point->x(); 
    } 
} 
0

Çok benzer bir sorunla karşılaştım. Veritabanı işlemleri ile ilgilenen bir genel depolama sınıfı ve sonra bir depolama alanı yöntemlerini bir try catch aracılığıyla (__call() kullanarak) bir konumdaki özel durumları ele alabilmem için bir proxy sınıfını ele aldım.

Artık, $storage->retrievePhoto($id) gibi depolama örneğine eriştiğimde, PHPStorm IDE, benim için işaretleme yapamadı. Benim çözümüm, $storage nesnesine başka bir sınıf adı ek açıklaması eklemeyi içeriyordu. Örneğin, aşağıya bakınız. Özgün proxy sınıfı, orijinal depolama sınıfında gerçekten sadece bir sarıcı olduğundan, bu, benim isteğim için hala% 100 olmasa da herhangi bir sorun ortaya çıkarmaz, ancak çalışır.

final class PhotoRepository 
{ 
    /** 
    * @var \Repositories\Photos\PhotoStorage 
    *  \Repositories\Photos\PhotoStorageExceptionHandlerProxy 
    */ 
    private $storage; 

    /** 
    * @param \Repositories\Photos\PhotosStorageExceptionHandlerProxy $storage 
    */ 
    public function __construct(PhotosStorageExceptionHandlerProxy $storage) 
    { 
     $this->storage = $storage; 
    }