Yayınımız yeniliklerle beraber yeni sitemizden devam ediyor. Seditio.com.tr takip edin.
PHP5.x'ten PHP7'ye yükseltme yaparken en sık karşılaşılan sorunlardan biri şu şekildedir:
Uyarı: preg_replace (): / e değiştiricisi artık desteklenmiyor, bunun yerine preg_replace_callback işlevini kullanın
PHP kılavuzunda iyi belgelenmiş bir sorun olmasına rağmen (v5.5'ten beri kullanımdan kaldırılmıştır ve v7.0.0'dan beri desteklenmemektedir), yukarıdaki uyarı, bir geliştiricinin yükseltmeyi gerçekleştirirken karşılaşabileceği en sinir bozucu geriye dönük uyumsuz değişikliklerden biridir: önerilen düzeltme - kodu daha yeni ve daha sağlam preg_replace_callback işlevini kullanarak yeniden uygulamak - her zaman kolay değildir, çünkü / e değiştiricisiyle birlikte preg_replace kullanımı birkaç yıl öncesine kadar PHP tabanlı komut dosyaları, uygulamalar ve arayüzler arasında oldukça yaygındı.
Aşağıdaki gönderide, sorunu çözmek için kullanabileceğimiz üç yöntemi paylaşıyoruz: kendi senaryonuz için en uygun olanı seçmekten çekinmeyin.
Düzeltme 1: Plana Bağlı Kal
Yapmamız gereken ilk şey, güncellenmiş preg_replace_callback işlevini etkili bir şekilde kullanıp kullanamayacağımızı kontrol etmek ve kodumuzu buna göre değiştirmektir. Söylemeye gerek yok, bu sorunu çözmenin en uygun yoludur, çünkü normal ifade tabanlı dize değiştirmeleri için geliştirilmiş PHP 7 yaklaşımını sıkı bir şekilde takip eder: temel alınan eval ( / e anahtarının anlamı buydu ) ve bir bunun yerine uygun temsilci yöntemi .
Belirli bir dizedeki tüm küçük harfleri büyük harfe dönüştürmek için kullanılabilecek "eski" bir preg_replace uygulama örneği:
$str = preg_replace("/([a-z]*)/e", "strtoupper('\\1')", $str);
İşte karşılık gelen, PHP7 için geçerli preg_replace_callback sürümü ( PHP5'te de çalışır):
$str = preg_replace_callback( "/([a-z]*)/", function($matches){ foreach($matches as $match){ return strtoupper($match); } }, $str );
Gördüğümüz gibi, temelde yapılacak üç şey var:
Düzeltme # 2: Sistemi Kandır
Bu tür senaryolarla karşı karşıyaysanız ve çaresizce bir çıkış yoluna ihtiyacınız varsa, yapabileceğiniz "en iyi" şey, desteklenmeyen / e değiştiriciyi aşağıdaki şekilde gerçek bir eval () çağrısıyla değiştirmektir :
$dizi = preg_replace_callback($preg['search'], function($m) use($preg) { $rep = $preg['replace'][1]; for ($i = 1; $i<count($m); $i++) { $rep = str_replace('\\'.$i, '$m['.$i.']', $rep); $rep = str_replace('\$'.$i, '$m['.$i.']', $rep); } eval('$str='.$rep); return $str; }, $dizi);
Biliyoruz, bu neredeyse hırsızlık kadar kötü… ve yine de, eval () işlevini kullanabileceğinizi varsayarak ( bariz güvenlik nedenleriyle çoğu sağlayıcı tarafından devre dışı bırakılan ) işi halleder .
3 Numaralı Düzeltme: Hataları Gizleyin
2. yöntem kötüyse, bu daha da kötüdür. Bunu önermemizin tek nedeni , komut dosyası kaynak kodunda önemli değişiklikler yapamayan ve düzeltemiyor olsalar bile uyarıyı geçici olarak gizlememiz gerekenler için hızlı bir çözüm sağlamamızın istenmesiydi.
$current_error_reporting = error_reporting(); // backup current error reporting settings error_reporting($current_error_reporting ^ ( E_WARNING )); // prevent E_WARNING messages from being shown $dizi = preg_replace($preg['search'], $preg['replace'], $dizi); // perform the (flawed) preg_replace call error_reporting($current_error_reporting); // restore the former error reporting settings
Bu düzeltme , E_DEPRECATED ve / veya E_STRICT seviye mesajlarını tamamen kapatmadan , PHP <= 5.4'ten PHP 5.5'e yükseltme yapanlar için de çok yararlı olabilir - bu hala / e değiştiriciyi destekliyor ancak kullanımdan kaldırıldığına dair bir uyarı veriyor. Söylemeye gerek yok, PHP 5.5.x için kullanmayı planlıyorsanız, değiştirdiğinizden emin olun.
E_WARNING ile E_DEPRECATED | E_STRICT bunun yerine 2. satırda.
Bu “carpet-based” stratejiden daha da fazla yararlanmak istiyorsanız, örneğin PHP'nin bazı hataları PHP_errors.log dosyasına program yoluyla kaydetmesini önlemek için, bu yazıyı okumanızı şiddetle tavsiye ederiz . Ancak, komut dosyası hatalarınızı gizlemenin neredeyse her zaman yapabileceğiniz en kötü şey olduğunu anlamak çok önemlidir: devam etmeden önce yaptığınız şeyin tüm sonuçlarını ve olası sonuçlarını anladığınızdan emin olun.
Yararlı referanslar