Şahsen, bu kodun hala oldukça kötü olduğunu düşünüyorum çünkü ne yaptığını yorumlamıyorsunuz. Ayrıca, girdilerini geçerlilik için test etmiyor, bu da onu çok kırılgan yapıyor.
Ayrıca, eval kullanımlarının% 95'i (veya daha fazlası) aktif olarak tehlikeli olduğundan, diğer durumlarda sağlayabileceği küçük potansiyel zaman tasarrufunun, onu kullanmanın kötü uygulamasına düşmeye değmeyeceğini düşünüyorum. Artı, daha sonra minyonlarınıza eval kullanımınızın neden iyi ve onların kötü olduğunu açıklamanız gerekecek.
Ve tabii ki, PHP'niz Perl'e benziyor;)
Eval () ile ilgili iki temel sorun vardır ("enjeksiyon saldırısı" senaryosu olarak):
1) Zarar verebilir 2) Basitçe çökebilir
ve teknikten çok sosyal olan:
3) İnsanları uygunsuz bir şekilde başka bir yerde kısayol olarak kullanmaya teşvik eder
İlk durumda, rastgele kod çalıştırma riskini alırsınız (tabii ki bilinen bir dizeyi değerlendirirken değil). Yine de girdileriniz düşündüğünüz kadar bilindik veya sabit olmayabilir.
Daha büyük olasılıkla (bu durumda) sadece kilitlenirsiniz ve dizeniz nedensizce anlaşılmaz bir hata mesajı ile sona erer. IMHO, tüm kodlar olabildiğince düzgün bir şekilde başarısız olmalı, başarısız olmalı ve bir istisna atmalıdır (en işlenebilir hata şekli olarak).
Bu örnekte, davranışa kodlamak yerine tesadüfen kodladığınızı öneririm. Evet, SQL enum ifadesi (ve bu alanın numaralandırmasından emin misiniz? - veritabanının doğru sürümünün doğru tablosunun doğru alanını mı çağırdınız? Gerçekten yanıt verdi mi?) PHP'de dizi bildirimi sözdizimi gibi görünüyor, ancak, gerçekten yapmak istediğiniz şeyin, girdiden çıktıya kadar en kısa yolu bulmak değil, belirtilen görevin üstesinden gelmek olduğunu öneririm:
- Bir numaranız olduğunu tanımlayın
- İç listeyi çıkarın
- Liste değerlerini paketinden çıkarın
Bu kabaca sizin seçeneğinizin yaptığı şeydir, ancak açıklık ve güvenlik için bazı if'ları ve yorumları etrafına sararım (örneğin, ilk eşleşme eşleşmezse, istisna atın veya boş sonucu ayarlayın).
Hala kaçan virgül veya alıntılarla ilgili bazı olası sorunlar var ve muhtemelen verileri paketinden çıkarıp alıntı yapmalısınız, ancak en azından verileri kod yerine veri olarak ele alıyor.
Preg_version ile en kötü sonucunuz muhtemelen $ sonuç = null olacaktır, eval sürümünde en kötüsü bilinmemektedir, ancak en azından bir çöküştür.
$result = array(); preg_replace_callback('#^enum\s*\(\s*\'|\'\s*\)\s*$#', function($m) use($result) { $result[] = $m[1]; }, $type);