PHP 7'ye Giriş: Yenilikler ve Neler Gitti?
Yayınlanan: 2022-03-112015 yılında PHP dünyasındaki en heyecan verici olaylardan biri, son ana sürüm olan PHP 5'in yayınlanmasından 10 yıl sonra PHP 7'nin piyasaya sürülmesiydi. .
Bununla birlikte, bazı uyumluluk kesintileri getiren eski, kullanımdan kaldırılmış işlevselliği de kaldırarak eski uygulamaların yeni sürüme geçişini zorlaştırır. Bu kılavuz, mevcut uygulamalarınızı PHP 7'nin üzerine taşımayı veya yenilerini oluşturmayı planlıyorsanız ne bekleyebileceğiniz konusunda hızlı bir tur olarak hizmet etmelidir.
Ama Bekleyin, PHP 6 Nereye Gitti?
Son zamanlarda PHP ile çalışmıyorsanız, PHP 6'ya ne olduğunu merak edebilirsiniz, neden PHP 5'ten PHP 7'ye geçildi? Uzun lafın kısası, PHP 6 başarısız oldu. Sürüm 6'nın ana özelliği, PHP esas olarak web geliştirmede kullanıldığından ve web'in Unicode'a ihtiyacı olduğundan, Unicode karakterleri için yerel destekti, bu nedenle Unicode'u PHP'ye getirme hareketi mantıklıydı.
Buradaki fikir, Unicode için tam desteği çekirdeğe getirmekti. Değişken ve işlev adları olarak aptal emojileri kullanma yeteneğinden güçlü uluslararası dize işlevselliğine kadar dile genişletilmiş yetenekler getirecekti. Örneğin, başka bir dilde İngilizce'den farklı olarak büyük ve küçük harfler kullanıldığında veya Çince karakterlerdeki bir adın İngilizce'ye dönüştürülmesi gerektiğinde.
Ne yazık ki, bu iddialı plan beklenenden daha büyük bir sorun olduğunu kanıtladı. Kod tabanının çoğunun, hem çekirdek hem de önemli uzantılar için Unicode'u desteklemek üzere taşınması gerekiyordu, bu da sıkıcı ve zor oldu. Bu, dildeki diğer özelliklerin gelişimini yavaşlattı ve bu süreçte birçok PHP geliştiricisini hayal kırıklığına uğrattı. Ek engeller ortaya çıktı, bu da yerel bir Unicode desteği geliştirmeye daha az ilgi gösterilmesine neden oldu ve sonuçta projenin terk edilmesine yol açtı.
Kitaplar ve makaleler gibi kaynaklar PHP 6 ve Unicode desteği için yazıldığından, karışıklığı önlemek için yeni sürüm PHP 7 olarak yeniden adlandırılacaktır.
Her neyse, üzücü geçmişte yeterince oturmak, PHP 7'nin partiye ne getirdiğini görelim.
Performans Savaşı, PHP 7 ve PHP 5
Neredeyse tüm güncellemelerle, küçük performans yükseltmeleri bekleniyor. Ancak, bu sefer PHP, önceki sürümlere göre önemli bir gelişme sağlayarak, saf performansı PHP 7'nin en çekici özelliklerinden biri haline getiriyor. Bu, Zend Engine'in içindekileri ele alan “PHPNG” projesinin bir parçası olarak geliyor.
Dahili veri yapılarını yeniden düzenleyerek ve bir Soyut Sözdizimi Ağacı (AST) biçiminde kod derlemesine bir ara adım ekleyerek, sonuç üstün performans ve daha verimli bellek tahsisidir. Rakamlar çok umut verici görünüyor; Gerçek dünya uygulamalarında yapılan karşılaştırmalar, PHP 7'nin ortalama olarak PHP 5.6'dan iki kat daha hızlı olduğunu ve istekler sırasında yüzde 50 daha az bellek tüketimine yol açarak PHP 7'yi Facebook'un HHVM JIT derleyicisi için güçlü bir rakip haline getirdiğini gösteriyor. Bazı yaygın CMS ve Çerçeveler için performansı gösteren Zend'den bu bilgi grafiğine bir göz atın.
Bellek tüketimindeki azalma, daha küçük makinelerin istekleri daha iyi işlemesine ve PHP etrafında mikro hizmetler oluşturma fırsatına da olanak tanır. Dahili değişiklikler, özellikle AST uygulaması, performansı daha da ileriye taşıyabilecek gelecekteki optimizasyonlar için olanaklar da sunuyor. Gelecekteki sürümler için bir JIT derleyicisinin şirket içi yeni bir uygulaması düşünülüyor.
PHP 7 Sözdizimsel Şeker
PHP 7, yeni sözdizimi özellikleriyle birlikte gelir. Dilin yeteneklerini genişletmemekle birlikte, kodunuzu yazmayı daha keyifli ve göze hoş getirmenin daha iyi veya daha kolay bir yolunu sağlarlar.
Grup İthalat Beyanları
Şimdi, aynı ad alanından kaynaklanan sınıflar için içe aktarma bildirimlerini tek bir use
satırında gruplayabiliriz. Bu, bildirimleri anlamlı bir şekilde hizalamaya yardımcı olur veya dosyalarınıza bazı baytları kaydeder.
use Framework\Module\Foo; use Framework\Module\Bar; use Framework\Module\Baz;
PHP 7 ile şunları kullanabiliriz:
use Framework\Module\{Foo, Bar, Baz};
Veya çok satırlı bir stili tercih ederseniz:
use Framework\Module{ Foo, Bar, Baz };
Null Birleştirme Operatörü
Bu, PHP programlamasında yaygın bir sorunu çözer; burada, eğer ikincisi gerçekten ayarlanmışsa, başka bir değişkenden bir değişkene bir değer atamak veya başka bir şekilde onun için farklı bir değer sağlamak istiyoruz. Kullanıcı tarafından sağlanan girdiyle çalışırken yaygın olarak kullanılır.
PHP 7 Öncesi:
if (isset($foo)) { $bar = $foo; } else { $bar = 'default'; // we would give $bar the value 'default' if $foo is NULL }
PHP 7'den sonra:
$bar = $foo ?? 'default';
Bu aynı zamanda bir dizi değişkenle zincirlenebilir:
$bar = $foo ?? $baz ?? 'default';
uzay gemisi operatörü
Uzay gemisi operatörü <=>
, 1,0 veya -1 döndürerek, yalnızca eşit olup olmadıklarını değil, aynı zamanda hangisinin daha büyük olduğunu da belirterek, iki değer arasında üç yönlü bir karşılaştırmaya izin verir.
Burada değerlerin nasıl farklı olduğuna bağlı olarak farklı işlemler yapabiliriz:
switch ($bar <=> $foo) { case 0: echo '$bar and $foo are equal'; case -1: echo '$foo is bigger'; case 1: echo '$bar is bigger'; }
Karşılaştırılan değerler tamsayılar, kayan değerler, dizgiler ve hatta diziler olabilir. Farklı değerlerin birbiriyle nasıl karşılaştırıldığına dair bir fikir edinmek için belgelere bakın. [https://wiki.php.net/rfc/combined-comparison-operator]
PHP 7'deki Yeni Özellikler
Ama elbette PHP 7, beraberinde yeni ve heyecan verici işlevsellik de getiriyor.
Skaler Parametre Türleri ve Dönüş Türü İpuçları
PHP 7, dört skaler türü ekleyerek yöntemlerdeki (sınıflar, arabirimler ve diziler) önceki türdeki parametre bildirimlerini genişletir; Olası parametre türleri olarak tamsayılar ( int
), kayan sayılar ( float
), booleanlar ( bool
) ve dizeler ( string
)
Ayrıca, isteğe bağlı olarak hangi tür yöntemlerin ve işlevlerin geri döneceğini belirtebiliriz. Desteklenen türler bool , int , float , string , array , callable , Class veya Interface adı , self ve parent (sınıf yöntemleri için)
class Calculator { // We declare that the parameters provided are of type integer public function addTwoInts(int $x, int $y): int { return $x + $y; // We also explicitly say that this method will return an integer } }
Tip bildirimleri, daha sağlam uygulamaların oluşturulmasına izin verir ve işlevlerden yanlış değerlerin iletilmesini ve döndürülmesini önler. Diğer avantajlar, eksik DocBlock'lar varsa kod temeli hakkında daha iyi bilgi sağlayan statik kod çözümleyicileri ve IDE'leri içerir.
PHP zayıf yazılmış bir dil olduğundan, bağlama göre parametre ve dönüş türleri için belirli değerler yayınlanacaktır. int
tipinde tanımlanmış bir parametresi olan bir fonksiyona “3” değerini iletirsek, yorumlayıcı bunu bir tamsayı olarak kabul edecek ve herhangi bir hata atmayacaktır. Bunu istemiyorsanız, bir declare
yönergesi ekleyerek strict mode
etkinleştirebilirsiniz.
declare(strict_types=1);
Bu, dosya bazında ayarlanır, çünkü genel bir seçenek, kod havuzlarını genel katılıkla oluşturulmuş olanlar ve olmayanlar olarak bölerek her ikisinden gelen kodu birleştirdiğimizde beklenmeyen davranışlara neden olur.
Motor İstisnaları
Motor istisnalarının eklenmesiyle, komut dosyasının sonlandırılmasına neden olabilecek önemli hatalar kolayca yakalanabilir ve işlenebilir.
Var olmayan bir yöntemi çağırmak gibi hatalar betiği sonlandırmaz, bunun yerine bir try catch bloğu tarafından işlenebilecek bir istisna atar, bu da uygulamalarınız için hata işlemeyi geliştirir. Bu, belirli türdeki uygulamalar, sunucular ve arka plan programları için önemlidir, çünkü önemli hatalar aksi takdirde yeniden başlatmalarını gerektirir. PHPUnit'teki testler, ölümcül hatalar tüm test takımını bıraktığı için daha kullanışlı hale gelmelidir. Hatalardan ziyade istisnalar, test senaryosu bazında ele alınacaktır.
PHP 7, karşılaşılabilecek hataların türüne göre bir dizi yeni istisna sınıfı ekler. Sürümler arasındaki uyumluluğu korumak için, hem motor istisnalarından hem de kullanıcı istisnalarından uygulanabilen yeni bir Throwable
arayüz eklendi. Bu, temel istisna sınıfını genişletmek için motor istisnalarından kaçınmak için gerekliydi, bu da daha önce orada olmayan eski kod yakalama istisnalarına yol açtı.
PHP 7'den önce bu, betiği önemli bir hatayla sonlandırabilirdi:
try { thisFunctionDoesNotEvenExist(); } catch (\EngineException $e) { // Clean things up and log error echo $e->getMessage(); }
Anonim Sınıflar
Anonim sınıflar, basit bir kısa vadeli örnekte kullanabileceğiniz anonim işlevlerin kuzenleridir. Anonim sınıflar, tıpkı normal bir nesne gibi kolayca oluşturulur ve kullanılır. İşte dokümanlardan bir örnek.
PHP Öncesi 7
class MyLogger { public function log($msg) { print_r($msg . "\n"); } } $pusher->setLogger( new MyLogger() );
Anonim sınıfla:
$pusher->setLogger(new class { public function log($msg) { print_r($msg . "\n"); } });
Anonim sınıflar, birim testinde, özellikle test nesneleri ve hizmetleriyle alay ederken yararlıdır. Bu, alay etmek istediğimiz arabirimi sağlayan basit bir nesne oluşturarak yoğun alaycı kitaplıklardan ve çerçevelerden kaçınmamıza yardımcı olur.

CSPRNG İşlevleri
Kriptografik olarak güvenli dize ve tamsayılar oluşturmak için iki yeni işlev eklendi.
random_bytes(int $len);
$len
uzunluğunda rastgele bir dize döndürür.
random_int(int $min, int $max);
$min
ve $max
arasında bir sayı döndürür.
Unicode Codepoint Kaçış Sözdizimi
Diğer birçok dilden farklı olarak, PHP 7'den önce, PHP'nin dize değişmezlerinde bir Unicode kod noktasından kaçmanın bir yolu yoktu, . Bu işlevsellik, UTF-8 kod noktalarını kullanarak bu tür karakterleri üretmek için kaçış \u
dizisini ekler. Bu, karakterleri doğrudan eklemekten daha iyidir ve aynı grafik gösterime sahip ancak anlam bakımından farklı olan karakterlerin yanı sıra görünmez karakterlerin daha iyi işlenmesine izin verir.
echo "\u{1F602}"; // outputs ‚
Bunun, davranışı değiştirdiği için mevcut kodu \u
dizisiyle bozduğunu unutmayın.
Jeneratörler Yükseltildi
PHP'deki jeneratörler ayrıca bazı güzel ek özellikler alır. Artık, üreteçlerin, yinelemenin ardından nihai bir değer çıkarmasına izin vermek için kullanılabilecek bir dönüş ifadesi var. Bu, üretecin hatasız yürütüldüğünü kontrol etmek için kullanılabilir ve üreteci çağıran kodun çeşitli senaryoları uygun şekilde işlemesine izin verir.
Ayrıca, üreteçler diğer üreteçlerden ifadeler döndürebilir ve verebilir. Bu, karmaşık işlemleri daha basit ve modüler birimlere ayırmalarını sağlar.
function genA() { yield 2; yield 3; yield 4; } function genB() { yield 1; yield from genA(); // 'genA' gets called here and iterated over yield 5; return 'success'; // This is a final result we can check later } foreach (genB() as $val) { echo "\n $val"; // This will output values 1 to 5 in order } $genB()->getReturn(); // This should return 'success' when there are no errors.
Beklentiler
Beklentiler, geriye dönük uyumluluğu korurken, assert()
işlevine yönelik bir geliştirmedir. Üretim kodunda sıfır maliyetli iddialara izin verirler ve iddia başarısız olduğunda geliştirme sırasında faydalı olabilecek özel istisnalar atma yeteneği sağlarlar.
assert()
, PHP 7'de bir dil yapısı haline gelir. İddialar, yalnızca geliştirme ve test ortamlarında hata ayıklama amacıyla kullanılmalıdır. Davranışını yapılandırmak için bize iki yeni direktif sağlandı.
-
zend.assertions
-
1
: kod oluştur ve çalıştır (geliştirme modu) (varsayılan değer) -
0
: kodu oluşturur ancak çalışma zamanında etrafında atlar -
-1
: sıfır maliyetli hale getiren kod oluşturmaz (üretim modu)
-
-
assert.exception
-
1
: iddia başarısız olduğunda, istisna olarak sağlanan nesneyi atarak veya istisna sağlanmadıysa yeni bir AssertionError nesnesi atarak atın -
0
: Yukarıda açıklandığı gibi bir Fırlatılabilir kullanın veya oluşturun, ancak nesneyi fırlatmak yerine yalnızca o nesneye dayalı bir uyarı oluşturun (PHP 5 davranışıyla uyumlu)
-
PHP 5'ten PHP 7'ye Geçmeye Hazırlanma
Büyük bir sürümün piyasaya sürülmesi, eski işlevleri değiştirme/güncelleme ve hatta çok eski olarak kabul edilirlerse veya bir süredir kullanımdan kaldırıldılarsa bunları kaldırma fırsatı sunar. Bu tür değişiklikler, eski uygulamalarda uyumlulukta kesintilere neden olabilir.
Bu tür sürüm sıçramalarından kaynaklanan bir başka sorun da, bağımlı olduğunuz önemli kitaplıkların ve çerçevelerin henüz en son sürümü destekleyecek şekilde güncellenmemiş olmasıdır. PHP ekibi, yeni değişiklikleri mümkün olduğunca geriye dönük uyumlu hale getirmeye ve yeni sürüme geçişin mümkün olduğunca ağrısız olmasına izin vermeye çalıştı. Daha yeni ve daha güncel uygulamalar, yeni sürüme geçmeyi daha kolay bulmalıdır, oysa eski uygulamalar, faydaların maliyetten daha fazla olup olmadığına karar vermek zorunda kalabilir, muhtemelen güncellememeyi tercih edebilir.
Çoğu mola küçüktür ve kolayca hafifletilebilirken, diğerleri daha fazla çaba ve zaman gerektirebilir. Temel olarak, PHP 7'yi yüklemeden önce uygulamanızda kullanımdan kaldırma uyarıları aldıysanız, muhtemelen düzeltilene kadar uygulamayı bozacak hatalar alırsınız. Uyarıldınız, değil mi?
Eski SAPI'ler ve Uzantılar
En önemlisi, eski ve kullanımdan kaldırılmış SAPI'ler, mysql
uzantısı gibi kaldırıldı (ancak bunu ilk etapta kullanmamalısınız, değil mi?). Uzantıların ve kaldırılan öne çıkanların tam listesi için bu RFC'leri buradan ve buradan kontrol edebilirsiniz.
Ek olarak, diğer SAPI'ler PHP 7'ye taşınmaktadır.
Tekdüzen Değişken Sözdizimi
Bu güncelleme, değişken-değişken yapılar için tutarlılık lehine bazı değişiklikler yaptı. Bu, değişkenlerle daha gelişmiş ifadelere izin verir, ancak aşağıda gösterildiği gibi bazı diğer durumlarda davranış değişiklikleri getirir.
// old meaning // new meaning $$foo['bar']['baz'] ${$foo['bar']['baz']} ($$foo)['bar']['baz'] $foo->$bar['baz'] $foo->{$bar['baz']} ($foo->$bar)['baz'] $foo->$bar['baz']() $foo->{$bar['baz']}() ($foo->$bar)['baz']() Foo::$bar['baz']() Foo::{$bar['baz']}() (Foo::$bar)['baz']()
Bu, bu gibi değerlere erişen uygulamaların davranışını bozar. Öte yandan, bunun gibi bazı güzel şeyler yapabilirsiniz:
// Nested () foo()(); // Calls the return of foo() $foo->bar()(); // IIFE syntax like JavaScript (function() { // Function body })(); // Nested :: $foo::$bar::$baz
Eski Stil Etiketleri Kaldırıldı
<% ... %>
, <%= ... %>
, <script language="php"> ... </script>
açılış/kapanış etiketleri kaldırıldı ve artık geçerli değil. Bunları geçerli olanlarla değiştirmek kolay olmalı, ama yine de onları kullanarak ne yapıyorsun, Acayip?
Sınıflar, Arayüzler ve Özellikler için Geçersiz Adlar
Parametre ve dönüş türleri gibi eklemelerden kaynaklanan sınıflar, arayüzler ve özellikler artık aşağıdaki adlara sahip olamaz:
- bool
- int
- batmadan yüzmek
- sicim
- boş
- doğru
- YANLIŞ
Bunlar, onları kullanan mevcut uygulamalarda ve kitaplıklarda kesintilere neden olur, ancak bunların düzeltilmesi kolay olmalıdır. Ayrıca, herhangi bir hataya neden olmamalarına ve geçerli olmalarına rağmen, ileride kullanılmak üzere ayrıldığından aşağıdakiler kullanılmamalıdır:
- kaynak
- nesne
- karışık
- sayısal
Bunları kullanmaktan kaçınmak, sizi gelecekte onları değiştirme işinden kurtarmalıdır.
Uyumluluğu bozabilecek değişikliklerin tam listesi için bu belgeye bakın.
Ayrıca, kodunuzu kontrol eden ve PHP 7'ye geçtiğinizde ortaya çıkabilecek olası sorunları tespit edebilen php7cc'yi de kullanabilirsiniz. Ancak elbette PHP 7'yi kurup kendiniz görmekten daha iyi bir yol yoktur.
Olası PHP 7 Uyumluluk Sorunları
PHP 7 Altyapı Uyumluluğu
Pek çok barındırma hizmeti PHP 7 için destek eklemeye başladı. Bu, paylaşılan barındırma sağlayıcıları için iyi bir haber, çünkü performans artışları, donanımlarındaki istemci web sitelerinin sayısını artırmalarına, işletme giderlerini düşürmelerine ve marjlarını artırmalarına olanak tanıyacak. Müşterilerin kendilerine gelince, bu koşullar altında çok fazla bir artış beklememeliler, ancak adil olmak gerekirse, paylaşımlı barındırma zaten performans odaklı bir seçim değil.
Öte yandan, sanal özel sunucular veya özel sunucular sunan hizmetler, bu performans artışının tüm avantajlarından yararlanacaktır. Heroku gibi bazı PaaS hizmetleri daha önce PHP 7'yi destekledi, ancak AWS Beanstalk ve Oracle'ın OpenShift'i gibi diğer hizmetler geride kalıyor. PHP 7'nin zaten desteklenip desteklenmediğini veya yakın gelecekte desteğin gelip gelmediğini görmek için PaaS sağlayıcınızın web sitesini kontrol edin.
Tabii ki, IaaS sağlayıcıları, donanımın kontrolünü elinize almanıza ve PHP 7'yi kurmanıza (veya beğeninize göre derlemenize) izin verir. PHP 7 paketleri, başlıca IaaS ortamları için zaten mevcuttur.
PHP 7 Yazılım Uyumluluğu
Altyapı uyumluluğuna ek olarak, olası yazılım uyumluluğu sorunlarına da dikkat etmeniz gerekir. WordPress, Joomla ve Drupal gibi popüler içerik yönetim sistemleri, en son sürümleriyle PHP 7 için destek ekledi. Symfony ve Laravel gibi büyük çerçeveler de tam destekten yararlanır.
Ancak, bir uyarının zamanı geldi. Bu destek, eklentiler, eklentiler, paketler veya CMS'niz veya çerçeveniz onlara ne ad verirse versin biçimindeki üçüncü taraf kodunu kapsamaz. Uyumluluk sorunları yaşayabilirler ve PHP 7 için her şeyin hazır olduğundan emin olmak sizin sorumluluğunuzdadır.
Aktif, bakımı yapılan depolar için bu bir sorun olmamalıdır. Ancak, PHP 7 desteği olmayan eski ve bakımı yapılmayan depolar, uygulamanızın tamamını kullanılamaz hale getirebilir.
PHP'nin Geleceği
PHP 7'nin piyasaya sürülmesi, eski ve kullanılmayan kodu kaldırdı ve gelecekte yeni özelliklerin ve performans yükseltmelerinin yolunu açtı. Ayrıca, PHP'nin yakında ek performans optimizasyonları kazanması bekleniyor. Geçmiş sürümlerle bazı uyumluluk kesintileri olmasına rağmen, sorunların çoğunun çözülmesi kolaydır.
Kitaplıklar ve çerçeveler artık kodlarını PHP 7'ye geçiriyor ve böylece en son sürümleri kullanıma sunuyor. Denemenizi ve sonuçlarını kendiniz görmenizi tavsiye ederim. Belki de uygulamanız zaten uyumlu ve PHP 7'den yararlanmayı bekliyor.