SmartObject
SmartObject, yıllarca PHP'deki nesne davranışını geliştirdi. PHP 8.4 sürümünden itibaren tüm özellikleri PHP'nin doğal bir parçası haline geldi ve böylece modern nesne yönelimli yaklaşımın öncüsü olma tarihi misyonunu tamamladı.
Kurulum:
SmartObject, 2007 yılında PHP'nin o zamanki nesne modelinin eksikliklerine devrimci bir çözüm olarak ortaya çıktı. PHP'nin nesne yönelimli tasarımda birçok sorunla karşı karşıya olduğu bir dönemde, geliştiriciler için önemli iyileştirmeler ve basitleştirmeler getirdi. Nette framework'ünün efsanevi bir parçası haline geldi. PHP'nin yıllar sonra kazanacağı işlevselliği sundu – nesne özelliklerine erişim doğrulamasından sofistike hata yönetimine kadar. PHP 8.4'ün gelişiyle, tüm özellikleri dilin doğal bir parçası haline geldiğinde tarihi misyonunu tamamladı. PHP'nin gelişimini dikkat çekici bir şekilde 17 yıl önceden gösterdi.
SmartObject ilginç bir teknik evrim geçirdi. Başlangıçta, diğer sınıfların gerekli işlevselliği miras aldığı
Nette\Object
sınıfı olarak uygulandı. PHP 5.4 ile trait desteğinin gelmesiyle önemli bir değişiklik
yaşandı. Bu, Nette\SmartObject
trait'ine dönüşümü sağladı ve daha fazla esneklik getirdi –
geliştiriciler işlevselliği başka bir sınıftan miras alan sınıflarda bile kullanabilir hale geldi. Orijinal
Nette\Object
sınıfı PHP 7.2 ile (sınıfların ‚Object‘ kelimesiyle adlandırılmasını yasaklayan) sona
ererken, Nette\SmartObject
trait'i yaşamaya devam ediyor.
Nette\Object
ve daha sonra Nette\SmartObject
'in sunduğu özellikleri inceleyelim. Bu işlevlerin her
biri, zamanında PHP nesne yönelimli programlamada önemli bir adımı temsil ediyordu.
Tutarlı Hata Durumları
Erken dönem PHP'nin en önemli sorunlarından biri, nesnelerle çalışırken tutarsız davranışlardı.
Nette\Object
bu kargaşaya düzen ve öngörülebilirlik getirdi. PHP'nin orijinal davranışına bakalım:
Fatal error uygulamayı herhangi bir tepki verme olasılığı olmadan sonlandırırdı. Var olmayan üyelere sessizce yazma,
tespit edilmesi zor ciddi hatalara yol açabilirdi. Nette\Object
tüm bu durumları yakalayıp bir
MemberAccessException
fırlatırdı, bu da programcıların hatalara tepki vermesini ve onları ele almasını
sağlardı:
PHP 7.0'dan beri dil artık yakalanamayan fatal error'lar oluşturmuyor ve PHP 8.2'den beri tanımlanmamış üyelere erişim hata olarak kabul ediliyor.
„Did you mean?“ Yardımcısı
Nette\Object
çok kullanışlı bir özellikle geldi: yazım hatalarında akıllı öneriler. Bir geliştirici bir
metot veya değişken adında hata yaptığında, sadece hatayı bildirmekle kalmaz, aynı zamanda doğru adı önererek yardım
ederdi. „Did you mean?“ olarak bilinen bu ikonik mesaj, programcıların yazım hatalarını aramak için harcadıkları
saatleri kurtardı:
Günümüzde PHP'nin kendisinde „did you mean?“ özelliği yok, ancak bu özellik Tracy tarafından sağlanıyor. Hatta bu tür hataları otomatik düzeltebiliyor.
Kontrollü Erişimli Properties
SmartObject'in PHP'ye getirdiği önemli yeniliklerden biri kontrollü erişimli property'lerdi. C# veya Python gibi dillerde yaygın olan bu konsept, geliştiricilerin nesne verilerine erişimi zarif bir şekilde kontrol etmelerini ve tutarlılıklarını sağlamalarını sağladı. Property'ler nesne yönelimli programlamanın güçlü bir aracıdır. Değişkenler gibi çalışırlar ancak aslında metodlarla (getter ve setter) temsil edilirler. Bu, girişlerin doğrulanmasını veya okuma anında değerlerin oluşturulmasını sağlar.
Property'leri kullanmak için şunları yapmalısınız:
- Sınıfa
@property <type> $xyz
şeklinde bir annotation ekleyin getXyz()
veyaisXyz()
adında bir getter,setXyz()
adında bir setter oluşturun- Getter ve setter'ın public veya protected olmasını sağlayın. Bunlar isteğe bağlıdır – yani read-only veya write-only property'ler olabilir
Circle sınıfında yarıçapın her zaman negatif olmayan bir sayı olmasını sağlamak için property'leri kullanan pratik
bir örneğe bakalım. public $radius
yerine bir property kullanalım:
PHP 8.4'ten beri, aynı işlevselliğe property hooks kullanılarak ulaşılabilir, bu da çok daha zarif ve özlü bir sözdizimi sunar:
Extension Methods
Nette\Object
, modern programlama dillerinden esinlenen başka bir ilginç konsepti PHP'ye getirdi – extension
methods. C#'tan alınan bu özellik, geliştiricilerin var olan sınıfları değiştirmeden veya onlardan miras almadan yeni
metodlarla genişletmelerini sağladı. Örneğin, bir forma özel bir DateTimePicker ekleyen bir addDateTime()
metodu ekleyebilirdiniz:
Extension metodları, editörlerin isimlerini önermemesi ve bunun yerine metodun var olmadığını bildirmesi nedeniyle pratik olmadığını kanıtladı. Bu nedenle destekleri sonlandırıldı. Günümüzde sınıf işlevselliğini genişletmek için composition veya inheritance kullanmak daha yaygın.
Sınıf Adını Alma
SmartObject sınıf adını almak için basit bir metod sunuyordu:
Reflection ve Annotation Erişimi
Nette\Object
, getReflection()
ve getAnnotation()
metodları aracılığıyla reflection
ve annotation'lara erişim sağlıyordu. Bu yaklaşım sınıf meta-bilgileriyle çalışmayı önemli ölçüde
basitleştirdi:
PHP 8.0'dan beri, meta-bilgilere özellikler (attributes) aracılığıyla erişmek mümkün, bu da daha fazla olanak ve daha iyi tip kontrolü sunuyor:
Method Getters
Nette\Object
metodları değişkenlermiş gibi aktarmanın zarif bir yolunu sunuyordu:
PHP 8.1'den beri first-class callable syntax kullanabilirsiniz, bu da konsepti daha da ileri taşıyor:
Olaylar (Events)
SmartObject olaylarla çalışmak için basitleştirilmiş bir sözdizimi sunar. Olaylar, nesnelerin durumlarındaki değişiklikler hakkında uygulamanın diğer kısımlarını bilgilendirmesini sağlar:
$this->onChange($this, $radius)
kodu aşağıdaki döngüye eşdeğerdir:
Netlik için $this->onChange()
sihirli metodundan kaçınmanızı öneririz. Pratik bir alternatif Nette\Utils\Arrays::invoke fonksiyonudur: