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

PHP

  • entries
    10
  • comments
    0
  • views
    538

Readonly Özellikler - PHP


Doğuhan ELMA

42 views

Bu DTO'yu önceki makalede başında oluşturduk:

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

public özelliklerin hoşlanmayabileceğiniz bir yönü, değerlerinin dışarıdan üzerine yazılabilmesidir. Projelerimizde DTO'ları değişmez olarak ele alma ve değerlerini hiçbir zaman dışarıdan değiştirmeme yönünde bir geleneğimiz var. Ancak birçok geliştiricinin hâlâ yalnızca geleneklere güvenme konusunda tedirginlik hissettiğini fark ettim. Öngörülemeyen değişiklikleri önlemek için alıcıları açıkça yazmayı tercih ederler:

 

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

    public function getName(): string
    {
        return $this->name;
    }

    public function getEmail(): string
    {
        return $this->email;
    }

    public function getBirthDate(): DateTimeImmutable
    {
        return $this->birth_date;
    }
}

Teknik olarak bu daha güvenli bir yaklaşım olsa da; bir sürü sıkıcı alıcı yazmamızı gerektiriyor. Bunları oluştursanız bile, bazen yüzlerce kod satırı sayan ve yalnızca verilerinin üzerine yazılamadığından emin olmak için DTO'larla karşılaşırsınız.

PHP 8.1 salt okunur anahtar sözcüğünü sunarak tüm bu sorunları çözüyor:

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

Bu anahtar kelime temelde adından da anlaşılacağı gibi yapar: bir özellik ayarlandıktan sonra artık üzerine yazılamaz:

<?php

$customerData = new CustomerDTO(
    'Brent',
    'brent@spatie.be',
    now(),
);
$customerData >name = 'Freek'; //hata
// Error: Cannot modify readonly property CustomerDTO::$name

 

Salt okunur özelliklere derinlemesine bakalım.

 

Yalnızca type özellikler:
Salt okunur özellikler yalnızca aynı zamanda type durumunda yapılabilir:

class CustomerDTO
{
    public readonly string $name;

    public readonly $mixed; //hata
}

 

Ancak tür ipucu olarak mixed kullanabilirsiniz:

class CustomerDTO
{
    public readonly string $name;

    public readonly mixed $mixed;
}

Bu kısıtlamanın nedeni, eğer yapıcıda açık bir değer sağlanmadıysa, PHP'nin bir özellik türünü atlayarak değerini otomatik olarak null olarak ayarlamasıdır. Bu davranışı salt okunur özelliklerle birleştirirseniz, birçok gereksiz kafa karışıklığıyla uğraşmak zorunda kalırız.

 

Hem normal hem de yükseltilmiş özellikler
Her ikisinin örneklerini zaten gördünüz: salt okunur özellik hem normal hem de tanıtılan özelliklere eklenebilir:


class CustomerDTO
{
    public readonly string $name;

    public function __construct(
        public readonly string $email,
    ) {}
}

 

Varsayılan değer yok:
Salt okunur özelliklerin varsayılan değeri olamaz:

class CustomerDTO
{
 	public readonly string $name = 'Brent'; //hata
}

 

Yani, tanıtılan özellikler olmadıkça:

class CustomerDTO
{
    public function __construct(
        public readonly string $name = 'Brent',
    ) {}
}

 

Yükseltilen özelliklerle çalışmasının nedeni, varsayılan değerin sınıf özelliği için değil, yalnızca yapıcı argümanı için kullanılmasıdır. Kaputun altında yukarıdaki kod şuna aktarılacaktır:

class CustomerDTO
{
    public readonly string $name;

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

 

Miras
Devralma sırasında yükseltilen bayrağı değiştirmenize izin verilmez:

class Foo
{
 	public readonly int $prop;
}
class Bar extends Foo
{
 	public int $prop; //hata
}

 

Ayarın kaldırılmasına izin verilmiyor
Salt okunur bir özellik ayarlandıktan sonra onu değiştiremezsiniz, hatta ayarını kaldıramazsınız:

$foo = new Foo('value');
unset($foo >prop); //hata

 

Klonlama:
Şu anda bir nesneyi klonlarken salt okunur özelliklerin üzerine yazamazsınız. Gelecekte bu davranışa izin verecek yapıya sahip bir klon ekleme fikri ortalıkta dolaşıyor. Hala başkalarına kopyalayabileceğiniz değişmez nesneler yaratabilmek oldukça faydalıdır. Henüz işlevselliğe sahip bir klon olmamasına rağmen, kullanıcı alanı kodunda da aynı şeyi başarmak mümkündür. Salt okunur özelliklerin üzerine yazarken bir nesneyi klonlamanıza olanak tanıyan bir paket oluşturdum. Kaputun altında bir miktar yansıma büyüsü kullanılıyor. İşte neye benziyor:

class Post
{
    use Cloneable;
    public function __construct(
        public readonly string $title,
    ) {}
}
$postA = new Post('Title');
$postB = $postA->with(title: 'Another title');

 

Salt Okunur Sınıflar
Bazen yalnızca salt okunur özellikleri içeren eksiksiz, değişmez bir DTO oluşturmak istersiniz. Bu durumda bir sınıf oluşturabilir ve tüm özellikleri salt okunur hale getirebilirsiniz:

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

Bunu yapmak oldukça zaman alabilir ve her yeni özellik eklediğinizde onu salt okunur yapmayı unutmamalısınız. PHP 8.2 bu soruna çok daha iyi bir çözüm getirdi: salt okunur sınıflar. Salt okunur sınıflarda, bir sınıfı bir kez salt okunur olarak bildirirsiniz ve içindeki tüm özellikler o andan itibaren salt okunur olur:

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

Salt okunur sınıfın bireysel özellikleri salt okunur özellikler gibi davranır, dolayısıyla daha önce tanımladığımız tüm davranışlar hala geçerlidir. Ayrıca, salt okunur bir sınıfa statik özellikler eklemek imkansızdır, bu da ölümcül bir hatayla sonuçlanır. Yalnızca salt okunur bir sınıftan uzanan salt okunur bir sınıf oluşturabilirsiniz. Bu kural, salt okunur olmayan bir sınıftan uzanan salt okunur bir sınıf oluşturmanın ve salt okunur bir sınıftan uzanan salt okunur olmayan bir sınıf oluşturduğunuz yerde bunun tersinin yasak olduğu anlamına gelir. Her iki durumda da ölümcül bir hatayla sonuçlanacaktır. Salt okunur özellikler hakkında söylenebilecek her şey bu kadar; onları gerçekten seviyorum ve onları giderek daha fazla kullanmayı sabırsızlıkla bekliyorum!

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