Neden birçok PHP Devs, isset () ve / veya PHP'nin empty () gibi benzer savunma işlevlerinden herhangi birini kullanmaktan nefret ediyor?


27

Stackoverflow üzerinde, bu sorunun her zaman azaldığını görüyorum:

Pek çok sağlam PHP tavsiyesi sunan Pekka bile , korkunç E_NOTICEcanavara çarptı ve kullanmaktan daha iyi bir çözüm umuyor isset(): isset () ve empty () çirkin hale getiriyor

Şahsen ben kullanmak isset()ve empty()birçok yerde benim uygulamaların akışını yönetmek için. Örneğin:

public function do_something($optional_parameter = NULL) {
    if (!empty($optional_parameter)) {
        // do optional stuff with the contents of $optional_parameter
    }
    // do mandatory stuff
}  

Bunun gibi basit bir snippet bile:

if (!isset($_REQUEST['form_var'])) {
    // something's missing, do something about it.
}

bana çok mantıklı geliyor. Şişmiş gibi görünmüyor, kararlı kod gibi görünüyor. Ancak birçok geliştirici, uygulamalarını E_NOTICEetkinleştiği için ateşledi , birçok sinir bozucu "başlatılmamış dizi dizini" bildirimini keşfetti ve sonra tanımlanmış değişkenleri kontrol etme ve kodlarını "gönderme" umuduyla yüzünü buruşturdu isset().

Başka dillerin işleri farklı şekilde ele aldığını sanıyorum. Tecrübelerden bahseden, JavaScript PHP kadar kibar değildir. Tanımsız bir değişken tipik olarak betiğin çalışmasını durduracaktır. Ayrıca, ( deneyimsizlikten konuşarak ) C / C ++ gibi dillerin derlenmeyi reddedeceğinden eminim.

Peki, PHP devs sadece tembel? (Sizden bahsetmiyorum Pekka, eski bir uygulamayı yeniden düzenlediğinizi biliyorum.) Veya diğer diller tanımlanmamış değişkenleri programcının tanımlanmış olup olmadığını ilk olarak kontrol etmelerini istemekten daha zarif bir şekilde ele alıyor mu?

( E_NOTICETanımsız değişkenlerin yanı sıra başka mesajlar da olduğunu biliyorum , ancak bunlar en çok dile gelenler gibi görünüyor)

Zeyilname
Şimdiye kadar cevaplardan, isset()kod şişirme olmadığını düşünen tek kişi ben değilim . Şimdi merak ediyorum, diğer dillerdeki programcılarla bunu ekleyen sorunlar var mı? Yoksa bu sadece bir PHP kültürü sorunu mu?


4
Ne yazık ki ben php devs "uyarıları" ile de kapalı çalışmalarını gördüm.
Viper_Sb

Ahh. Yani bir üzücü.
Stephen

1
PHP kullanıcısı olmamak merak ediyorum: neden tanımsız değişkenleri kontrol etmeniz gerekiyor?
Winston Ewert

2
@Winston: PHP ile ilgili sorun (birçok dilin aksine) PHP'nin birçok yapılandırma kombinasyonuna izin vermesidir. Örneğin, programcı uyarıları, bildirimleri ve kullanımdan kaldırma bildirimlerini görmezden gelmeye karar verebilir. Daha deneyimli geliştiriciler, her şeyi raporlamak için ayarlanan error_reporting ile çalışacaktır. PHP ayrıca, istisnalar atmak yerine hata atan ve durum kodlarını döndüren birçok fonksiyona sahiptir. Savunmasız ve başarılı bir şekilde kodlama yapabilmek için dilin çok samimi olması gerekiyor. Diğer birçok dil bu seçeneğe izin vermiyor. Sıkı, genellikle varsayılan ve tek seçenektir.
Wil Moore III

1
Eklediği ayrıntılardan dolayı isset () 'i beğenmedim. @'Nin daha iyi bir şekli güzel bir alternatif olacaktır.
Kzqai

Yanıtlar:


34

Ben kodluyorum E_STRICTve başka bir şey yok.

Boş ve isset kontrolleri kullanmak kodunuzu çirkin yapmaz, kodunuzu daha ayrıntılı hale getirir. Aklımda onları kullanmaktan kaynaklanabilecek en kötü şey nedir? Birkaç karakter daha yazarım.

Bunları kullanmamanın sonuçlarını, en azından uyaranlara çevirir.


7
Benim gelişim ortamım da E_STRICT. Üretimdeki tüm hataları bastırıyorum, ancak bu sadece geliştirme aşamasında yanımda hiçbir şeyin kaymadığından emin olmak.
Stephen

2
+1 Josh, Ben aynı şekilde. E_STRICT programlamasında , kodunda asla sürprizlerin olmayacağını biliyorsun . Uçmanın tek yolu, imo.
EricBoersma

3
@Stephen: Üretim için her zaman hataları kapat. Bu sadece bir güvenlik ağı. Kalkınma her zaman (IMO) olmalıdır E_STRICT. Kod yaz ve tüm uyarı ve hataları çöz.
Josh K

beni papağan mı :)
Stephen

@Stephen: Kabul ediyorum. :)
Josh K

17

Bence bilinmeyen unsurlara ilişkin bildirimler PHP'de bir tasarım hatası. Emin şimdi hatayı düzeltmek mümkündür değilim, ama sanki Demirbaş bir sürü kod üretir if(isset($foo['abc']) && $foo['abc'] == '123')- Bu kod olmamalıdır sahip issetbelirli bir yerde '123' olup olmadığını kontrol etmektir niyet beri, $foove şey yoksa orada olduğunu Kesinlikle '123' değil. İki kat fazla kod yazmanızın tek nedeni PHP'deki bu talihsiz tasarım hatası. Ve PHP'de bildirimler çok pahalı, ne yazık ki, bu yüzden yalnızca bunları devre dışı bırakmak, performansın endişe verici olduğu bir kod seçeneği değildir.

Yani evet, IMHO kodunu çirkin yapıyor ve beni rahatsız ediyor. Ve deneyim eksikliği yüzünden değil - 1998'den beri PHP kullanıyorum ve .php3uzantı olduğunu hatırlıyorum ve "PHP 2 değil" anlamına geliyordu. Belki tembelim :) Ama tembellik - en azından belirli bir tür - bir programcı için bir erdemdir.

Öte yandan, geçerli yazı kullanımı issetve empty- tıpkı yazıdakiler gibi - iyi. PHP'nin isset/emptygerçekten ihtiyaç duyulmadığı yerlerdeki uyarılar konusunda aşırı kıskanç olduğunu düşünüyorum .


3
Sağ. Bu bir aykırılık meselesi. $eg = isset($_GET['eg'])? $_GET['eg'] : null;gülünç bir fiil. Ben gerçekten " $eg = @$_GET['eg'];array-key-the-null" anahtarının varlığını kabul etmenin " kısa anlamı için duracak" hata baskısı "olmayan başka bir operatör olsaydı . Bugünlerde kısa bir işlev kullanıyorum.
Kzqai

7
Kabul. 4 yıl sonra, Null Coalesce Operator'e girin: wiki.php.net/rfc/isset_ternary bize vererek$eg = $_GET['eg'] ?? null;
Steve

Ya da sadece şimdi hata bastırma operatörü ile yapın, örneğin $eg = @$_GET['eg'] ?: null;. Genelde kullanmıyorum, ancak bu durumda açıkça bu hatayı bekliyoruz ve onu görmezden gelmeye karar veriyoruz. Boş değer birleşmesinden daha uzun bir karakterdir ve o kadar iyi değildir (tüm hataları bastırır ve bir dizide değil, sadece bir dizide değil, korkak şeyler yapan bir ArrayAccess olabilir), ancak genel olarak işi yapar.
El Yobo

12

PHP'nin web'de yorumlanan ve kullanılan ücretsiz bir dil olarak, neden savunmacı bir şekilde kodlamaları gerektiğinin tam olarak farkında olmayan ve uyarıları başka bir gereksiz hata olarak görmeleri gerektiğinin farkında olmayan, çok yüksek oranda profesyonel olmayan, kodlanmamış bir kodlayıcı olduğuna inanıyorum. .

Bu puanları her zaman küçük geliştiricilerin ve kendi kendini öğreten senaryo kodlayıcılardan duyuyorum:

  • Zaten ortaya çıkacaksa neden bir değişkeni başlatmalı?
  • Neden kullanmadan önce bir şey olup olmadığını kontrol et, undefined yine de yanlışsa eşittir?
  • @ İle önek eklersem kodumu düzeltir, neden işleri karmaşıklaştırır?

Hiç bir zaman kesin olarak yazılmış bir dil yaşamamışlarsa veya açıklanmamış / yetersiz değişkenlerin tuzaklarını deneyimlemişlerse, ikna edici olurlar. Ben genellikle bir saat boyunca kod hata ayıklama zevkini yaşamaya başladıktan sonra genellikle verdiklerini buluyorum.

Diğer güçlü faktör PHP'nin güvenlik ve kod kalitesinden çok verim ile daha fazla ilgilenme eğiliminde olan web endüstrisindeki kullanımıdır.


10
“PHP'nin [...] profesyonel olmayan, eğitimsiz kodlayıcılara oranının çok yüksek olduğuna inanıyorum” Özel bir PHP dev olarak, size daha fazla katılıyorum. +1
Stephen

@Stephen Son zamanlarda temelde PHP ve jQuery kodları yazdım, ancak örgün bir eğitimim var, ancak daha önce sorumlu olduğunuz bir profesyonel olarak gördüğünüz kod ... bazen inanca meydan okuyor. ;-)
Orbling

1
PHP ile ilgili gerçek bir sorun olduğunu düşünüyorum. Dilde bazı tuhaflıklar dışında (her yeni versiyonda yavaşça çözüyorlar), çevresinde bir amatörlük havası var. Profesyonel bir PHP dev olmanın bazen sinir bozucu olabileceğini hayal edebiliyorum, çünkü 'köşedeki patronun yeğeni' ile karşılaştırılıyorsunuz.
Erik van Brakel,

1
@Erik PHP on yıl önce Perl'in oldukça zayıf bir akrabasıydı, şimdi özellikle web kullanımı için oldukça makul bir yorumlanmış dil. Facebook gibi şirketlerin bunu kullanmasının bir nedeni var. Ancak her yerde olduğu gibi, amatör set onu yaygın olarak kullanıyor ve bu saygınlığı azaltıyor.
Orbling

5

Evet, tembeller. Yine de çoğu ...

Ne yazık ki, pek çok PHP kodlayıcısının zihniyeti "Eksik değişkenlerin neden olduğu hataları vb. İşlemek için dile dayanarak aynı sonuca daha çabuk ulaşabiliyorsanız, savunmanın bir anlamı yoktur." Biliyorum, onlardan birkaçıyla çalıştım.

Ayrıca, doğru hata yönetimi ve raporlama eksikliği, canlı sunucuları birkaç saatliğine çıkardıklarında, erken bir öğle yemeğine gizemli bir şekilde yönelenlerdir.


5
PHP kodlayıcıları üzerine öznel görüş için -1.
Josh K

4
@Josh, kıdemli bir PHP kodlayıcısı olan 4 1/2 yıldır ve PHP'yi 1999'dan beri açık ve kapalı olarak kodladı, korkarım biraz öznelim. "Öte yandan, daha deneyimli PHP kodlayıcıları tembel değil ve işleri doğru şekilde yapmalı" olarak nitelendirmeliydim ...
Gruffputs

1
Sahip olmalısın.
Josh K

5

Dizileri veri aktarma nesneleri olarak kullanmaktan kaçınarak isset () ve empty () yöntemlerinden kaçınmaya çalışıyorum. Aklı başında varsayılanlara sahip sınırlı bir özellik kümesini kabul edecek ve bu özelliklerin girişini doğrulayacak şekilde yapılandırılabilecek bir sınıf oluşturun. ArrayAccess arayüzünü bile uygulayabilir, böylece onu bir dizi gibi kullanabilirsiniz. Bu aynı zamanda, birileri yönteminize yanlış bir varlık türü iletmeye çalıştığında hataları yakalamak için yöntem imzalarınızda tür ipucu kullanmanıza izin verir.


Çok ilginç bir yaklaşım.
Toby,

2

Sorgulanan sorulardan biri benim, bu yüzden tekrar etmeme izin ver.

Birçok geliştirici isset(), kalite işareti olarak çoğunun varlığını yanlış yapar . Bir güvenilirlik görünümü verir ve bazı insanlar güvenlik özelliği olarak bile düşünür.

Fakat PHP'nin derlenmiş bir dil olmadığını dikkate almalısınız. Dinamik tip sistemli bir betik dilidir. E_NOTICE hataları, yalnızca ada göre hatalardır. Ve eğer issetbirçoğu sadece bildirimleri bastırma niyetiyle kullanılıyorsa , o zaman aslında sadece dile karşı kodlama yapıyorsunuzdur .

Peki, PHP devs sadece tembel?

Gerçekten de, bildirimler ve atılan çok sayıda uyarı görürseniz durum budur. Çok sayıda yenidoğan ihbarı önemsemiyor ve bu genellikle tamamen özürlü olmanın sonucudur error_reporting(0).

Bununla birlikte, diğer geliştiricilerin, yalnızca @ ya da baskı altında bırakılmadıkları için E_NOTICE'ları tanımadıkları için yanılıyorsunuz. En azından bu tutulan bildirimler sorusunun arkasındaki niyetimdi . Kurtulacak bir şey değil, zaman zaman önemli hata ayıklama bilgileri.

Tüm genellemeler gibi, isset'in düşüncesiz kullanımı da optimal kodlamaya yol açmaz. Nerede issetve emptygerekli ve nerede sözdizimsel tuz olduklarını ayırt etmek önemlidir .

Yoksa bu sadece bir PHP kültürü sorunu mu?

Hayır, tanımsız değişken "hata" sadece bir PHP problemi değildir. Bash, TCL ve Perl veya JavaScript tanımsız değişkenlerin kullanımına izin verir. Ancak bu içkin dil özelliği orada kusur olarak görülmez. Tanımlanmamış değerleri kontrol etmek için benzer dil yapıları vardır. Ancak, undef değerlerinin "hata" olarak yanlış tanımlanmadığı için PHP'deki kadar sürekli kullanılmazlar.


1

İlginç. Ben neredeyse hiç isset () kullanmıyorum. PHP kodum nadiren, ilk etapta bir değişken ayarlanmış olup olmadığını bilmediğim bir durumda. Kullanılan her GET veya POST değişkenine, mevcut değilse, varsayılanı sağlayacak bir işlevle erişilir. İşlev çağrılarındaki varsayılan değerler genellikle açıkça 0 veya boş dizeler olarak ayarlanır.


+1. Bir işleve veya sınıf yöntemine geçmek güzel bir çözümdür. Aslında DO bunu, ancak bir de benim yukarıdaki örnekler hala temiz ve bana un-kabartılan bakmak çimdik.
Stephen

0

Ben setset ve bol boş kullanırım. Ama çoğunlukla, birinin parametreleriyle uğraşması durumunda $ _REQUEST işleme gibi bahsettiğiniz yerler. Etrafta uçuşan tüm değişkenler üzerinde kontrolüm olduğu durumlarda, genellikle onlara ihtiyaç duymadığımı anlıyorum.


0

İsset kullanmaktan hoşlanmıyorum, ancak başkası tarafından yapılan kod kütleleri varsa, o zaman tasarruf lütuf olabilir. Bu soruna yardımcı olmak için aşağıdaki wee kodunu yazdım, eğer isset () isseter kullanmak yerine ($ a, $ b), $ a tanımlanmadığında veya boşsa ya da işlev null değerini döndürdüğünde $ b döndürür. Herhangi bir gelişme, hoş geldiniz:

//returns var or NULL (if undefined)
//$reserve optional second value is returned as $default if undefined
function isseter(&$default,&$reserve=NULL)
{
$default = isset($default) ? $default : NULL;
$reserve = isset($reserve) ? $reserve : NULL;
if ((!$default) && ($reserve)) $default=$reserve;
return $default;
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.