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

PHP

  • entries
    10
  • comments
    0
  • views
    538

Property Promotion - PHP


Doğuhan ELMA

32 views

PHP'nin tip sistemi konusuna iki makale yazdıktan sonra, diğer bazı özelliklere derinlemesine bakmanın zamanı geldi. Bu bölümde, PHP'nin sözdizimine yapılan, gereksiz standart kodların çoğunu ortadan kaldıran bir eklemeye bakacağız. Mümkün olduğunca değer nesnelerini ve veri aktarım nesnelerini kullanmayı tercih ettiğimi fark etmişsinizdir. Yalnızca veri içeren basit nesnelerle çalışmayı ve bunları karmaşık süreçlerde kullanılmak üzere etrafa aktarmayı seviyorum. Daha sonraki bir bölümde, nesne yönelimli kodun bu görünümü hakkında daha fazlasını paylaşacağım. Ancak bu tür veri odaklı nesneler çok sayıda standart kodla birlikte gelir. Aşağıda müşteri veri aktarım nesnesinin bir örneği verilmiştir:

 

class CustomerDTO
{
    public string $name;
    public string $email;
    public DateTimeImmutable $birth_date;
    public function __construct(
        string $name,
        string $email,
        DateTimeImmutable $birth_date
    ) {
        $this->name = $name;
        $this->email = $email;
        $this->birth_date = $birth_date;
    }
}

 

PHP 8.0'dan önceki geleneksel PHP'de her özelliğin adını dört kez yazmanız gerekirdi. Yapıcı mülk promosyonu sayesinde yukarıdakileri şu şekilde yeniden yazabilirsiniz:

class CustomerDTO
{
    public function __construct(
        public string $name,
        public string $email,
        public DateTimeImmutable $birth_date,
    ) {}
}

Bu oldukça fark! Bu özelliğe derinlemesine bakalım.

 

Nasıl çalışır
Temel fikir basit: sınıf özelliklerini ve değişken atamalarını bir kenara bırakın ve yapıcı parametrelerinin önüne genel, korumalı veya özel değerlerini ekleyin. PHP bu yeni sözdizimini alacak ve kodu çalıştırmadan önce onu normal sözdizimine dönüştürecektir.

Yani bu kodu yazdığınızda:

class Person
{
    public function __construct(
        public string $name = 'Brent',
    ) {
        // …
    }
}

PHP onu şu şekilde dönüştürecektir:

class Person
{
    public string $name;
    public function __construct(
        string $name = 'Brent'
    ) {
        $this->name = $name;

        // …
    }
}

Ve bunu ancak daha sonra yürütür. Bu kod dönüşümü muhtemelen daha yaygın bir adla biliniyor, en azından JavaScript topluluğuna biraz aşina iseniz: transpiling. Aynen öyle: PHP çalışma zamanında kendisini aktarır (ve daha iyi performans için sonuçları önbelleğe alır). Statik analizle ilgili önceki bölüm ve dilin yalnızca statik analiz sırasında kullanılan özellikleri ekleme vizyonunu nasıl paylaştığım göz önüne alındığında, bu ilginç bir düşünce. Tanıtılan mülklerle neler yapabileceğinizi ve yapamayacağınızı daha ayrıntılı olarak ele alalım.

 

Yalnızca Yapıcılar'da
Yükseltilen özellikler yalnızca yapıcılarda kullanılabilir. Bu açık görünebilir, ancak açıklığa kavuşturmak için bahsetmeye değer olduğunu düşündüm.

Yükseltilmiş ve normal özellikleri birleştirme
Tüm yapıcı özelliklerinin tanıtılması gerekmez; ayrıca karıştırıp eşleştirebilirsiniz:

class MyClass
{
    public string $b;
    public function __construct(
        public string $a,
        string $b,
    ) {
        $this->b = $b;
    }
}

Sözdizimlerini karıştırırken dikkatli olun çünkü kodunuzu daha az anlaşılır hale getirebilir. Tanıtılan ve tanıtılmayan özellikleri karıştırıyorsanız normal bir kurucu kullanmayı düşünün.

Yinelenenler Yok
Aynı ada sahip bir sınıf özelliği ve yükseltilmiş bir özellik bildiremezsiniz. Yükseltilen özellik çalışma zamanında bir sınıf özelliğine aktarıldığı için bu oldukça mantıklıdır:

class MyClass
{
    public string $a;
    public function __construct(
        public string $a, //hata
    ) {}
}

 

Untyped Özellikler
Untyped özellikleri tanıtmanıza izin verilir, ancak önceki bölümlerde tartıştığım gibi, mümkün olan her yerde türleri kullanmanız daha iyi olur:

class MyDTO
{
    public function __construct(
        public $untyped,
    ) {}
}

 

Defaults

Tanıtılan özellikler varsayılan değerlere sahip olabilir:

public function __construct(
    public string $name = 'Brent',
    public DateTimeImmutable $date = new DateTimeImmutable(),
) {}

new DateTimeImmutable() işlevinin varsayılan parametre olarak kullanılabilmesinin yalnızca PHP 8.1'den itibaren mümkün olduğunu unutmayın; bu daha sonraki bir makalelerde ele alınacaktır.

 

Oluşturucu Gövdesi İçinde


Yapıcı gövdesinde tanıtılan özellikleri okumanıza izin verilir. Ekstra doğrulama kontrolleri yapmak istiyorsanız bu yararlı olabilir. Her ikisi de iyi çalıştığı için yerel değişkeni ve örnek değişkeni kullanabilirsiniz:

public function __construct(
    public int $a,
    public int $b,
) {
    assert($this->a = 100);
    if ($b = 0) {
        throw new InvalidArgumentException('…');
    }
}

 

Öznitellikler
Nitelikler gelecek makale konusudur, dolayısıyla bunu bir ön bakış olarak düşünün: tanıtılan mülklerde bunlara izin veriliyor. Aktarıldığında, hem yapıcı parametresinde hem de class özelliğinde mevcut olacaklardır:

class MyClass
{
    public function __construct(
        #[MyAttribute]
        public $a,
 ) {}
}

 

Soyut(Abstract) Oluşturucularda İzin Verilmez
İtiraf etmeliyim ki soyut kurucuların bir şey olduğunu bilmiyordum ve onları hiç kullanmadım. Ayrıca, tanıtılan mülklerin bunlara girmesine izin verilmez:

abstract class A
{
    abstract public function __construct(
        public string $a, //hata
    ) {}
}

 

TRAITS izin veriliyor
TRAITS'de tanıtılan özelliklere izin verilir. Aktarılan kod geçerli bir özellik ile sonuçlanacağından, özelliklerde yükseltilmiş özellikleri desteklemek mantıklıdır. Özelliklerde yapıcılara sahip olmanın iyi bir şey olup olmadığı başka bir sorudur.

trait MyTrait
{
    public function __construct(
        public string $a,
    ) {}
}

 

Var Desteklenmiyor
Eski - yani deneyimli - PHP geliştiricileri uzak geçmişte sınıf değişkenlerini bildirmek için var kullanmış olabilirler, ancak yapıcı tanıtımında buna izin verilmez. Yalnızca public, proctected ve private geçerli anahtar kelimelerdir.

public function __construct(
    var string $a, //hata
) {}

 

Değişken Parametreler Yükseltilemez
Tür dizisi olan bir türe dönüştüremediğiniz için değişken parametreleri yükseltmek mümkün değildir.

public function __construct(
    public string ==...$a, //hata
) {}

 

Biliyor musun
  Değişken işlevler, PHP 5.6'da eklenen bir özellik olan dinlenme operatörünü (...) kullanır. Değişkenlerin tüm "geri kalanını" alacak ve bunları bir dizide birleştirecek bir işlev giriş değişkeni tanımlamanıza olanak tanır. Başka bir deyişle: func_get_args()'ın kısa yolu.

 

isPromoted İçin Yansıma
Hem ReflectionProperty hem de ReflectionParameter, sınıf özelliğinin veya yöntem parametresinin yükseltilip yükseltilmediğini kontrol etmek için yeni bir isPromoted() yöntemine sahiptir.

 

Miras
PHP yapıcılarının ana kurucularının beyanına uymaları gerekmediğinden, söylenecek çok az şey vardır: mirasa izin verilir. Özellikleri alt kurucudan ana kurucuya aktarmanız gerekiyorsa, bunları manuel olarak aktarmanız gerekir:

class A
{
    public function __construct(
        public $a,
    )
    {
    }
}

class B extends A
{
    public function __construct(
        $a,
        public $b,
    )
    {
        parent::__construct($a);
    }
}

 

Özellikler tanıtımı hakkında söylenecek her şey bu kadar. İlk başta kullanmakta tereddüt ettim ama denediğimde kısa sürede alıştım. İtiraf etmeliyim ki, tanıtılan özellikler muhtemelen PHP 8.0'ın en sevdiğim özelliğidir.

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...