2011-08-16 13 views
6

, ben PDT gibi "modern" editörler hakkında gıpta tek şey PDT türlerini ve hatta PHPDoc "tipi ipuçları", ör anlar olduğunuPHP yorumlayıcısı PHPDoc tipi ipuçlarından haberdar olabilir mi? bir Emacs kullanıcısı olarak

/** 
    * @param DateTime $date 
    * @param string $name 
    * @return DOMDocument 
    */ 

Şu anda ben parametre türü yanlış alırsanız PHP yorumlayıcı beni uyar hale getirmek için olabilir yerde tipi ipuçları kullanır, ancak parametre bir nesne olması durumunda çalışır. Daha da önemlisi, bir fonksiyonun dönüş değerinin belirli bir tipte olduğundan emin olmanın bir yolu yoktur.

Bu bir ihtimal olabilir, ama herhangi bir eklenti veya PDT olduğunu aynı şekilde PHPDoc yorumların PHP yorumlayıcı farkında yapma başka yolu var mı? Ben mesela, ben bir int parametresi bildirdikten bir dize geçirirseniz İdeal olarak, ben yanlış türde bir değer dönerseniz önemli hatalar olsun ister ya ederim.

+0

Soru gibi ama bildiğim kadarıyla cevap mümkün değil. – MitMaro

+2

PHP, kasıtlı olarak dinamik ve zayıf yazılmıştır, bu yüzden türleri zorlamaya çalışmak, yokuş yukarı bir savaş olacaktır. – erisco

+2

[PHPLint] 'e göz atın (http://www.icosaedro.it/phplint/) – shesek

cevap

1

sayılı PHP açık tip beyanı veya Tür Dayatma desteklemez, type juggling kullanımı açıkça PHP yorumlayıcı bir parçasıdır. Tür ipucu üzerine documents uyarınca, yalnızca nesne ve dizi tipi ipuçları desteklenir.

sıkı tip gereklerine bir işlev varsa, bu bir fonksiyonun başlangıcında bu argümanları doğrulamak için gerekli olur, Söylediğin. Eğer çok PHP'de türleri fikrine bağlı, aşağıdakileri yapabilirsiniz yazılan bir dile a) anahtar ya (heh) veya b) Bir Autoboxing/nesne sarıcı desen kullanın. Orada bu önemli performans cezası, ancak bunun yerine (yani is_string) türü için ilkel kontrolleri kullanmak yerine, sarmalayıcı sınıf ve kullanım Tür Dayatma oluşturabilirsiniz:

class StringWrapper { 
    public $value = null; 
    function __construct($val) { 
    $this->value = $val; 
    } 

} 

function requires_a_string(StringWrapper $string_value) { 
echo $string_value->value; 
} 

$string = new StringWrapper('Hello world!'); 

Gördüğünüz gibi, bu oldukça büyük bir tepeye sadece önlemek için (her türü için bir sarıcı oluşturma) tırmanmaya:

function requires_a_string($string_value='') { 
if (!is_string($string_value)) 
    return false; 
echo $string_value; 
} 

Benim kararı geçerli: değmez.

Burada Autoboxing biraz daha okuyabilirsiniz: Ayrıca http://php.webtutor.pl/en/2011/04/13/strong-data-typing-in-php-part-ii-autoboxing-and-indestructable-objects-english-version/ , Autoboxing için bu RFC not: https://wiki.php.net/rfc/autoboxing Yine de bir süre için yaklaşık edilmiş, bu yüzden bunun için uzatmak olmaz.

+0

Evet, hayır ya o tepeye tırmanmak istemiyorum. Bu yüzden, ellerinde çok fazla zaman bulunan birinin bu şeyi otomatik olarak yapan bir eklenti veya modül yazacağını umuyordum. Bu gibi görünmüyor ... –

2

SplTypes uzantısına bakmalısınız (dikkat: deneyseldir). Bu, "ilkellerin" türünün ima edilmesine izin verir (en sonun, hayal edilebilecek her şekilde ilkellerden daha iyi olduğunu duydum).

Okuyucu için bir egzersiz olarak ayrılacağım hayal kırıklığı yaratabilecek bir geçici çözüm olsa da, yorumlayıcı gücü ilkelerini başka yollarla yapamazsınız.

+0

Bu uzantının deneysel olduğunu, herhangi bir zamanda düşürülmüş olabileceğini ve çok fazla yüke sahip olduğuna dikkat edilmelidir. Ayrıca, bu doğru yazım değil, daha ziyade nesne sarmanın bir uygulamasıdır. –

+0

Bu potansiyel olarak ilginç, itiraf etmeliyim ki, sintaks $ int = new SplInt (94); Ancak PECL operatör aşırı yükleme paketi ile birlikte bir geçici çözüm olabilir. –

+0

@Chris Bunu belirtmek için teşekkür ederiz. Unutmuştum (bunu asla kullanmam, sadece havalı olduğunu düşünüyorum). – cwallenpoole

0

O sayıl türleri için Tür Dayatma yapmak ne kadar büyük bir tartışma oldu:

  • Kesinlikle obivios yani '123' int eğer hokkabazlık
  • deneyin her zaman oynama yapmak tip
  • deneyin kontrol edin (123'in) ancak '123aaa' int (123)

ama Bildiğim kadarıyla artık geliştiriciler çözüm, tüm

de skaler tip ipuçlarını kullanmaz bilmek olarak

PHP manual diyor ki:
Tür İpuçları yalnızca nesne ve diziden (PHP 5.1'den beri) olabilir. Int ve string ile geleneksel tip ipucu desteklenmiyor.