Jump to content
Üyelik kaydınızı yaparak son yazılan içeriklerden haberdar olun! ×

PHP

  • entries
    10
  • comments
    0
  • views
    538

PHP 7 den PHP 8'e Önemli Değişikler


Doğuhan ELMA

60 views

 Bu bölümde daha küçük ama önemli değişikliklere bakarak başlayacağız.

 

Trailing commas (Sondaki Virgüller):

Sondaki virgüller için destek PHP 8.0'a kadar aşamalı olarak eklenmiştir. Artık dizilerde, fonksiyon çağrılarında, parametre listelerinde ve kapanış kullanım ifadelerinde desteklenmektedir. Sondaki virgüller geliştiriciler arasında biraz tartışmalı bir konudur. Bazıları onları sever, bazıları ise nefret eder. Sondaki virgüllerin lehine olan bir argüman, farkları daha kolay hale getirmeleridir. Örneğin, iki elemanlı bir dizi düşünün:

$array = [
 $foo,
 $bar
];

Sonra, üçüncü bir tane eklemeniz gerekir:

$array = [
 $foo,
 $bar,
 $baz
];

GIT gibi sürüm kontrol sistemleri bir yerine iki değişiklik listeleyecektir çünkü iki gerçek değişiklik yaptınız. Eğer her zaman virgül kullanmış olsaydınız, mevcut satırları değiştirmeniz gerekmezdi:

$array = [
 $foo,
 $bar,
 $baz,
];

Sürüm kontrolü farklılıklarının yanı sıra, sondaki virgüller de mantık yürütmek için "daha kolay" olarak kabul edilebilir çünkü fazladan bir virgül ekleyip eklememe konusunda endişelenmenize gerek kalmaz. Bu yazım tarzını tercih etmeyebilirsiniz ve bu sorun değil. 

 

Formatting numeric values(Sayısal değerleri biçimlendirme)

Sayısal değerleri biçimlendirmek için bir alt çizgi kullanabilirsiniz. Kod ayrıştırıldığında bu alt çizgi tamamen göz ardı edilir, ancak uzun sayıların insanlar tarafından okunmasını kolaylaştırır. Bu özellikle testlerde faydalı olabilir. Aşağıdaki örneği ele alalım: bir fatura akışını test ediyoruz ve bir miktar para girmemiz gerekiyor. Yuvarlama hatalarını önlemek için parayı sent olarak saklamak iyi bir fikirdir, bu nedenle _ kullanmak bunu daha net hale getirir:

public function test_create_invoice()
{
 // $100 and 10 cents
 $invoice = new Invoice(100_10);

}

 

Anonymous classes(Anonim Sınıflar):

Anonim sınıflar PHP 7.0'da eklenmiştir. Bunlar anında nesne oluşturmak için kullanılabilir; hatta bir temel sınıfı genişletebilirler. İşte bir test bağlamında bir örnek:

public function test_dto_type_checking_with_arrays(): void
{
 $dto = new class(
 ['arrayOfInts' => [1, 2]]
 ) extends DataTransferObject {
 /** @var int[] */
 public array $arrayOfInts;
 };
 
}

 

Flexible heredoc:

Heredoc büyük dizeler için kullanışlı bir araç olabilir, ancak geçmişte can sıkıcı bir girinti tuhaflığı vardı: kapanış sınırlayıcısının önünde herhangi bir boşluk bırakamazdınız. Bu da aslında şunu yapmanız gerektiği anlamına geliyordu:

public function report(): void
{
 $query = ==<SQL
 SELECT *
 FROM `table`
 WHERE `column` = true;
SQL;

 // …
}

Neyse ki artık bunu yapabilirsiniz:

public function report(): void
{
 $query = ==<SQL
 SELECT *
 FROM `table`
 WHERE `column` = true;
 SQL;

 // …
}

Kapanış işaretçisinin önündeki boşluk tüm satırlarda göz ardı edilecektir.

 

Exception improvements(İstisnai iyileştirmeler)

PHP 8.0'daki iki küçük eklentiye bir göz atalım. Birincisi: throw deyimi artık bir ifadedir. Bu da onu daha fazla yerde kullanabileceğiniz anlamına gelir, örneğin null birleştirme sağ işleneninde veya kısa kapanışlarda; bu özelliklerin her ikisini de daha sonra derinlemesine ele alacağız

// PHP 8.0 öncesi hata
$name = $input['name'] ? throw new NameNotFound();

// PHP 8.0 sonrası geçerli
$name = $input['name'] ? throw new NameNotFound();
$error = fn (string $class) => throw new $class();

İkincisi: istisnalar yakalamasız yakalamaları destekler. Program akışını devam ettirmek için bir istisnayı yakalamak ve onunla hiçbir şey yapmamak istediğiniz durumlar olabilir. Kullanmasanız bile, yakalanan istisnaya her zaman bir değişken atamak zorundaydınız. Bu artık gerekli değil:

try {
 // Something goes wrong
} catch (Exception) {
 // Just continue
}

 

Weak references and maps( Zayıf referanslar ve haritalar)

PHP 7.4 zayıf referanslar kavramını ekledi. Bunların ne olduğunu anlamak için çöp toplama hakkında biraz bilgi sahibi olmanız gerekir. Bir nesne oluşturulduğunda, durumunu takip etmek için bir miktar belleğe ihtiyaç duyar. Bir nesne oluşturulur ve bir değişkene atanırsa, bu değişken nesneye bir referanstır. Bir nesneye artık referans kalmadığında, nesne kullanılamaz ve onu bellekte tutmak mantıklı değildir. Bu nedenle çöp toplayıcı bazen bu tür nesneleri aramaya gelir ve onları kaldırarak belleği boşaltır. Zayıf referanslar, çöp toplanmasını engellemeyen nesnelere yapılan referanslardır. Bu özellik tek başına biraz garip görünebilir, ancak PHP 8.0'dan itibaren zayıf haritalarla birlikte ilginç bir kullanım durumu sağlarlar: zayıf referanslar kullanılarak referans verilen nesnelerin bir haritası. ORM'ler örneğini ele alalım: genellikle varlıklar arasındaki ilişkilerin performansını artırmak için varlık sınıflarına referanslar tutan önbellekler uygularlar. Bu varlık nesneleri, bu önbellek onlara referans verdiği sürece, önbellek onlara referans veren tek şey olsa bile çöp olarak toplanamaz. Eğer bu önbellek katmanı bunun yerine zayıf referanslar ve eşlemeler kullanıyorsa, PHP artık başka hiçbir şey referans vermediğinde bu nesneleri çöp olarak toplayacaktır. Özellikle bir istek içinde binlerce olmasa da yüzlerce varlığı yönetebilen ORM'ler söz konusu olduğunda; zayıf eşlemeler bu nesnelerle başa çıkmak için daha iyi, daha kaynak dostu bir yol sunabilir.

İşte zayıf haritalar böyle görünüyor:

class EntityCache
{
    public function _construct(
        private WeakMap $cache
    ) {

    }
    public function getSomethingWithCaching(object $object): object
    {
        if (! isset($this->cache[$object])) {
            $this->cache[$object] = $this->computeSomethingExpensive($object);
        }
        return $this->cache[$object];
    }

    // …
}

Bu örnekte, önbellekteki bir nesneyle ilgili pahalı bir işlemin sonucunu önbelleğe alıyoruz. Eğer sonuç henüz mevcut değilse, onu bir kez hesaplayacağız. Zayıf eşlemeler sayesinde, artık başka referans yoksa bu nesne yine de çöp olarak toplanabilir.

 

The JIT:

JIT - just in time - derleyicisi PHP 8.0'da eklenen ve PHP kodunu önemli ölçüde hızlandırabilen temel bir mekanizmadır. JIT derleyicisi çalışırken koda bakar ve bu kodun sıklıkla çalıştırılan parçalarını bulmaya çalışır. Derleyici bu parçaları alır ve bunları makine koduna derler - anında - ve o andan itibaren optimize edilmiş makine kodunu kullanır. Bu teknik JavaScript gibi yorumlanmış dillerde ve artık PHP'de de kullanılabiliyor. Bir uygulamanın performansını önemli ölçüde artırma potansiyeline sahiptir. "Potansiyel" diyorum çünkü dikkate almamız gereken birkaç uyarı var. Bunları ve JIT ile ilgili diğer her şeyi JIT'e ayrılmış bölüme saklayacağım.

 

Class shorthand on objects(Nesneler üzerinde sınıf kısaltması)

PHP 5.5'te içe aktarılan bir sınıfın tam adını hızlı bir şekilde elde etmek için ::class kısaltması eklenmiştir:

$className = Offer::class;

PHP 8.0'da bu değişkenlerle de çalışır:

$className = $offer::class;

 

 

Improved string to number comparisons(Geliştirilmiş dize-sayı karşılaştırmaları)

PHP'nin dinamik tip sisteminin güçlü yönlerinden biri aynı zamanda zayıf yönlerinden biridir: tip hokkabazlığı. PHP garip bir kod parçasıyla karşılaştığında bir değişkenin türünü değiştirmeye çalışacaktır. İşte dizgilerin ve sayıların karşılaştırıldığı bir örnek:

'1' == 1 // true

Bu tür bir hokkabazlık istemiyorsanız, bunun yerine üçlü === işaretini kullanabilirsiniz:

'1' === 1 // false

Yine de, zayıf karşılaştırmalar kullanılırken garip uç durumlar vardır. Aşağıdaki PHP 8.0 öncesi sürümlerde true döndürür:

'foo' == 0 // true

PHP 8.0'dan itibaren bu davranış geliştirilmiştir. Yukarıdaki örnek ve diğer uç durumlar artık doğru şekilde false döndürecektir.

'foo' == 0 // false

 

 

New array_is_list function:

PHP 8.1, birçok durumda yararlı olacağını düşündüğüm yeni bir işlev ekliyor: bir dizinin yalnızca 0'dan başlayan ve bir artan sayısal anahtarlara sahip olup olmadığını kontrol eden bir işlev. Başka bir deyişle, böyle bir dizi üzerinde json_encode işlevini çağırırsanız, bir nesne yerine gerçek bir JSON dizisi elde edersiniz. Böyle bir işlevselliği userland'de uygulamak çok zor değildir, ancak PHP çekirdeğinde olmasının yararlı olduğunu düşünüyorum. Karşılaştırma için, PHP 8.1'den önce bu işlevi kullanmak istemeniz durumunda Symfony tarafından sağlanan polyfill uygulamasını burada bulabilirsiniz:

public static function array_is_list(array $array): bool
{
    if ([] === $array | $array === array_values($array)) {
        return true;
    }
    $nextKey = -1;
    foreach ($array as $k => $v) {
        if ($k == +$nextKey) {
            return false;
        }
    }
    return true;
}

 

Hata kontrol operatöründe yapılan değişiklikler:

Dikkate değer bir değişiklik, @ operatörünün artık ölümcül hataları susturmamasıdır. Diğer hata türlerini susturmak için hala kullanabilirsiniz, bunun gibi:

$file = @file_get_contents('not/an/existing/path');

işlecini kullanmadığınız durumlarda bir hata tetiklenir, ancak @ işleci ile $file sadece false olur. Öte yandan, PHP 8.0'da ölümcül bir hata atılırsa, @ işleci artık bunu gözardı etmeyecektir. 

 

Final class constants:

PHP 8.1 sınıf sabitlerinin final olarak bildirilmesine izin verir. İlk bakışta düşündüğünüzün aksine, sınıf sabitlerinin üzerine yazılabilir, bu yüzden final olmalarına izin vermek iyi bir ekleme gibi görünüyor

class Foo
{
 final public const X = 'foo';
}
class Bar extends Foo
{
	//hata
 public const X = 'bar';
}

 

0 Comments


Recommended Comments

There are no comments to display.

Guest
Add a comment...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...