Bazı yararlı PHP Deyimler nelerdir?

8 Cevap php

Ben PHP kodlama geliştirmek için arıyorum ve PHP-spesifik teknikler, diğer programcılar verimlilik ya da geçici çözüm PHP sınırlamaları geliştirmek için kullanmak merak ediyorum.

Bazı örnekler:

  1. Ad alanlarını işlemek için sınıf adlandırma kuralı: Part1_Part2_ClassName dosyasına eşler Part1/Part2/ClassName.php

  2. if ( count($arrayName) ) // handles $arrayName being unset or empty

  3. Değişken fonksiyon isimleri, örneğin, $func = 'foo'; $func($bar); // calls foo($bar);

8 Cevap

Sonuçta, herhangi bir şey PHP-spesifik odaklanarak önce, genellikle iyi programlama uygulamaları öğrenerek ilk PHP dışında en alırsınız. Bunu söyledikten sonra ...


Apply liberally for fun and profit:

  1. Foreach döngülerinde Yineleyicilerde. Yanlış bir zaman hemen hemen hiç yok.

  2. Sınıf autoloading etrafında tasarım. Kullan spl_autoload_register(), değil __autoload(). Bonus puan için, ardışık bir dizin ağacı taramak var, o zaman bir daha mantıksal bir dizin yapısı halinde sınıfları yeniden düzenlemek için çekinmeyin.

  3. Her yerde Typehint. Skalerler için iddialar kullanın.

    function f(SomeClass $x, array $y, $z) {
        assert(is_bool($z))
    }
    
  4. Çıktı HTML başka bir şey.

    header('Content-type: text/xml'); // or text/css, application/pdf, or...
    
  5. Istisnaları kullanmayı öğrenin. Istisnalar içine hataları dönüştüren bir hata işleyici yazın.

  6. Sınıf sabitleri ile define() küresel sabitleri değiştirin.

  7. Uygun Date sınıf ile Unix damgalarını değiştirin.

  8. Uzun işlevlerinde unset() değişkenleri onlarla bittiğinde.


Use with guilty pleasure:

  1. Bir dizi gibi bir nesnenin veri üyeleri üzerinde döngü. Onlar özel beyan olmadığını suçlu hissediyorum. Bu Python ya da Lisp gibi bazı putperest bir dil değildir.

  2. Uzun dizeleri montajı için çıkış tamponları kullanın.

    ob_start();
    echo "whatever\n";
    debug_print_backtrace();
    $s = ob_get_clean();
    

Avoid unless absolutely necessary, and probably not even then, unless you really hate maintenance programmers, and yourself:

  1. Magic yöntemleri (__get, __set, __call)

  2. extract()

  3. Yapısal diziler - bir nesne kullanın

PHP ile benim deneyim bana bir şeyler öğretti. Birkaç isim:

  • Her zaman çıkış hataları. Bunlar (geliştirme modunda) benim tipik projesinin ilk iki hatları şunlardır:
ini_set('display_errors', '1');
error_reporting(E_ALL);
  • Asla automagic. Özdevinimli_yükle Stuff gibi gelecekte sizi ısırabilir.

  • Her zaman require_once kullanılarak bağımlı sınıfları gerektirir. Bu şekilde size bağımlılıkları düz olacak emin olabilirsiniz.

  • if(isset($array[$key])) yerine if($array[$key]) arasında kullanın. Anahtar tanımlı değilse, ikinci bir uyarı çıkaracağız.

  • ($j yerine $listIndex) onlara ayrıntılı isimler vermek (hatta döngü {[0) (]} ile) değişkenleri tanımlarken,

  • Yorum, yorum, açıklama. Belirli bir kod pasajı apaçık ortada yoksa, bir yorum bırakın. Daha sonra bunu gözden gerekebilir ve bunun amacı ne hatırlamıyorum olabilir.

Bunun dışında, sınıf, fonksiyon ve değişken adlandırma kuralları sizin ve ekip kadar vardır. Onlar bana doğru hissediyorum çünkü son zamanlarda ben Zend Framework's naming conventions kullanarak oldum.

Ayrıca, ve geliştirme modunda, ben bir hata işleyicisi ayarlamak zaman ki çıktısı bana full backtrace veren ufak hata bir hata sayfası (hatta uyarılar).

Bu soruya bakın: Hidden Features of PHP. Bu listenin en üstüne kadar kabarmış olan en iyi hangi gerçekten yararlı ipuçları PHP, bir yeri vardır.

Neyse ki, ad alanları 5.3 ve 6 vardır. Ederim Path_To_ClassName deyim kullanarak karşı öneriyoruz. Bu dağınık kod yapar, ve sen hiç ... kütüphane yapısını asla değiştiremezsin.

Portföyünde özdevinimli_yükle harika. Eğer organize ediyorsanız, size içerir ve her dosyanın üstündeki gerektiren tipik 20-çizgi bloğu kaydedebilirsiniz. Ayrıca kod kütüphanesi etrafında şeyleri değiştirebilir, ve sürece PHP bu dizinleri içerebilir gibi, hiçbir şey kırılır.

=== üzerinde liberal faydalanmak ==. Örneğin:

if (array_search('needle',$array) == false) {
  // it's not there, i think...
}

'iğne' tuşuna sıfır ise yanlış negatif verecektir. Bunun yerine:

if (array_search('needle',$array) === false) {
  // it's not there!
}

her zaman doğru olacaktır.

PHP-özel olma eğilimindedir PHP yapmam bir kaç şey vardır.

  1. Bir dizi dizeleri birleştirin.

    Dize manipülasyon bir sürü PHP pahalı, bu yüzden ben yapmak dize manipülasyon ayrık sayısını azaltmak algoritmalar yazmak eğilimindedir. Klasik örnek bir döngü ile bir dize inşa ediyor. Bunun yerine, bir dizi () ile başlayın, ve döngüde dizi birleştirme yapın. Sonra sonunda) (it patlar. (Bu da düzgün sondaki-virgül sorunu çözer.)

  2. Dizi sabitleri işlevlerine adlandırılmış parametreleri uygulanması için şık vardır.

Ben son 5 yıldır PHP (ve MySQL) ile gelişmekte oldum. En yakın zamanda bir çerçeve kullanarak (Zend) (Dojo), bir katı javascript kütüphanesi ile başladı ve (iyi bir şekilde, sanırım) sonsuza dek işe yolu değişti.

Beni bu düşündürdü şey ilk kurşun oldu: Zend framework 'denetleyicileri' ve 'eylemleri' erişmenin standart bir yolu tam olarak bu gibi yapar.

Farklı veritabanları, Zend_Db'nin bu çok iyi sorunları kapatmak ve soyutlama açısından. Dojo, farklı tarayıcılar arasında javascript tutarsızlıkları ütü mükemmel bir iş yapar.

Genel olarak, iyi OOP teknikleri içine alma ve kullanma değer (ve HAKKINDA OKUMA!) Çerçeveler OOP sorunları anlamak almanın çok eller yolu olmuştur.

Kullanarak değer bazı bağımsız araçlar için, ayrıca bkz:

Smarty (template engine) ADODB (database access abstraction)

Farklı tür ve === operatörü tanıyın, bu strpos() gibi bazı işlevler için gereklidir ve return false Kendini kullanmaya başlayacağız.

Tüm cevaplar için teşekkürler. Burada bazı çok yararlı şeyler var.

Özelliği IMO gelmesi uzun bir zaman aldı ve 5.3 alpha1 henüz üretim hazır değil çünkü ad alanları (ve Path_To_ClassName yaklaşım kullanarak değil) ilgili noktası ile hafif bir sorunu var. Yani bize geri kalanı arada çalışan ne olursa olsun yapmak yapmaktayız. Geç asla daha iyi olsa da.

Açıkçası, herhangi biri bu soruya right cevap yok, ama ben (site Beni sağlar varsayarak) kadar tüm cevaplar kadar oy vereceğim.