Disclaimer; Ben ancak bunlarla sınırlı olmamak üzere, eval tuzaklar ve "kötülüklerin" tam olarak farkında değilim: vb performans sorunları, güvenlik, taşınabilirlik em>
The problem
Eval PHP manuel okuma ...
eval() returns NULL unless return is called in the evaluated code, in which case the value passed to return is returned. If there is a parse error in the evaluated code, eval() returns FALSE and execution of the following code continues normally. It is not possible to catch a parse error in eval() using set_error_handler().
Kısacası, çok yararlı olduğu yanlış dönen, ama ben sur el m olduğum dışında hiçbir hata yakalama yolu daha iyi yapabilirdi!
The reason
Ben üzerinde çalışıyorum sitenin işlevselliği bir kısmı ifadeleri yürütme dayanır. Ben sanal veya yürütme modülleri yolundan geçmesi için değil istiyorum, bu yüzden eval kullanarak bitirdiler. Eğer "müşteri kötü çıktı ne olur?!" Bağırmak önce istemci hemen hemen güvenilir olduğunu biliyorum; onun kendi sitesi kırmak istemem, ve hemen hemen bu işlevi erişimi almak herkes ne olursa olsun eval, sunucu sahibi.
İstemci Excel gibi ifadeler bilir, ve bu küçük farkları açıklayan bir sorun değildir, ancak uyarı çeşit olan hemen hemen standart işlevselliği.
Bu ben bugüne kadar ne var:
define('CR',chr(13));
define('LF',chr(10));
function test($cond=''){
$cond=trim($cond);
if($cond=='')return 'Success (condition was empty).'; $result=false;
$cond='$result = '.str_replace(array(CR,LF),' ',$cond).';';
try {
$success=eval($cond);
if($success===false)return 'Error: could not run expression.';
return 'Success (condition return '.($result?'true':'false').').';
}catch(Exception $e){
return 'Error: exception '.get_class($e).', '.$e->getMessage().'.';
}
}
Notes
- Işlevinin herhangi bir olay bir ileti dize döndürür
- Kod ifadesi PHP etiketleri olmadan ve bitiş virgül olmadan, PHP bir tek hat parçası olmalı
- Yeni hat boşluk dönüştürülür
- Bir değişken sonucunu içeren ilave edilir (ifade ya doğrudur ya yanlıştır dönmelidir ve eval dönüşü ile çakışmaması amacıyla, geçici bir değişken kullanılır.)
Yani, daha fazla yardımcısı için kullanıcı ne eklemek isterdiniz? Daha olası hataları / sorunları belirlemekte olabilecek başka ayrıştırma fonksiyonları var mı?
Chris.