Ulaşım
- Adres:Batıkent Mh. 8910 Sk. 6. Etap 1H No: 18 Yeni Toki Eyyübiye / Şanlıurfa (Yeni Alım Satım Karşısı)
- Telefon:0 (545) 528 88 93
- eMail: info@alestaweb.com
PHP 8.4 ile birlikte gelen Property Hooks özelliği, PHP dünyasında devrim niteliğinde bir yenilik. Getter ve setter metodlarına veda etmeye hazır mısınız? Alesta Web olarak bu rehberde PHP 8.4 Property Hooks'un nasıl çalıştığını, neden bu kadar önemli olduğunu ve projelerinizde nasıl kullanabileceğinizi adım adım anlatacağız. Hadi başlayalım!
Property Hooks, PHP 8.4 ile gelen ve sınıf özelliklerine (class properties) doğrudan get/set davranışı eklemenizi sağlayan bir özelliktir. Yani artık ayrı getter ve setter metodları yazmak zorunda değilsiniz!
Alesta Web ekibi olarak yüzlerce PHP projesi geliştirdik ve şunu söyleyebiliriz: Bu özellik gerçekten oyun değiştirici. C# ve Kotlin gibi modern dillerde uzun süredir var olan bu yapı, sonunda PHP'ye de geldi.
Property Hooks, PHP RFC-0001 kapsamında kabul edildi ve PHP 8.4.0'da stabil olarak yayınlandı. Bu özellik backward compatible değildir, yani PHP 8.3 ve altında çalışmaz.
<?php
class User {
private string $name;
public function getName(): string {
return $this->name;
}
public function setName(string $name): void {
if (strlen($name) < 2) {
throw new InvalidArgumentException('İsim en az 2 karakter olmalı');
}
$this->name = ucfirst(strtolower($name));
}
}
$user = new User();
$user->setName('mahmut');
echo $user->getName(); // Mahmut
?>
<?php
class User {
public string $name {
get => $this->name;
set {
if (strlen($value) < 2) {
throw new InvalidArgumentException('İsim en az 2 karakter olmalı');
}
$this->name = ucfirst(strtolower($value));
}
}
}
$user = new User();
$user->name = 'mahmut'; // Doğrudan atama!
echo $user->name; // Mahmut
?>
Gördüğünüz gibi, Alesta Web olarak söyleyebiliriz ki kod çok daha temiz ve okunabilir hale geldi. Getter/setter boilerplate'i tarihe karıştı!
<?php
class Circle {
public function __construct(
public float $radius
) {}
// Computed property - sadece okunabilir
public float $area {
get => pi() * $this->radius ** 2;
}
public float $circumference {
get => 2 * pi() * $this->radius;
}
}
$circle = new Circle(5);
echo $circle->area; // 78.539816339745
echo $circle->circumference; // 31.415926535898
?>
<?php
class Product {
public string $sku {
set => strtoupper($value); // Otomatik büyük harf
}
public float $price {
set {
if ($value < 0) {
throw new InvalidArgumentException('Fiyat negatif olamaz');
}
$this->price = round($value, 2);
}
}
}
$product = new Product();
$product->sku = 'abc123';
echo $product->sku; // ABC123
?>
Arrow function syntax (=>) tek satırlık işlemler için idealdir. Daha karmaşık logic için süslü parantez {} kullanın.
<?php
class EcommerceProduct {
public string $name {
set => trim($value);
}
public float $price {
set {
$this->price = max(0, round($value, 2));
}
}
public int $stock {
set => max(0, (int)$value);
}
// Computed property
public bool $isAvailable {
get => $this->stock > 0;
}
// KDV dahil fiyat
public float $priceWithVat {
get => $this->price * 1.20; // %20 KDV
}
}
$product = new EcommerceProduct();
$product->name = ' iPhone 15 Pro ';
$product->price = 54999.999;
$product->stock = 10;
echo $product->name; // "iPhone 15 Pro"
echo $product->price; // 55000.00
echo $product->priceWithVat; // 66000.00
echo $product->isAvailable; // true
?>
<?php
class Order {
private ?array $items = null;
public function __construct(
public int $id
) {}
// Lazy loading - sadece erişildiğinde yükle
public array $orderItems {
get {
if ($this->items === null) {
// Veritabanından yükle (Alesta Web best practice)
$this->items = $this->loadItemsFromDatabase();
}
return $this->items;
}
}
private function loadItemsFromDatabase(): array {
// PDO veya ORM ile yükleme...
return ['item1', 'item2', 'item3'];
}
}
?>
Alesta Web olarak bu pattern'i sıklıkla kullanıyoruz. Lazy loading sayesinde gereksiz veritabanı sorguları önlenir ve performans artar.
PHP 8.4'ün bir diğer harika özelliği de asymmetric visibility. Okuma ve yazma için farklı erişim seviyeleri tanımlayabilirsiniz.
<?php
class BankAccount {
// Public okuma, private yazma
public private(set) float $balance = 0;
// Public okuma, protected yazma
public protected(set) string $accountNumber;
public function deposit(float $amount): void {
if ($amount > 0) {
$this->balance += $amount;
}
}
public function withdraw(float $amount): void {
if ($amount > 0 && $amount <= $this->balance) {
$this->balance -= $amount;
}
}
}
$account = new BankAccount();
$account->deposit(1000);
echo $account->balance; // 1000 (okuma OK)
// $account->balance = 500; // HATA! Dışarıdan yazılamaz
?>
Asymmetric visibility ile Property Hooks birlikte kullanılabilir. Ancak dikkatli olun: private(set) kullandığınızda set hook dışarıdan çağrılamaz.
Alesta Web deneyimlerimize göre Property Hooks kullanırken dikkat edilmesi gerekenler:
| Yapın ✅ | Yapmayın ❌ |
|---|---|
| Basit validasyonlar için hooks kullanın | Karmaşık business logic'i hooks'a koymayın |
| Computed properties için get hook kullanın | Veritabanı işlemlerini get hook'ta yapmayın |
| Veri dönüşümleri için set hook kullanın | Side effect'leri (email gönderme vb.) hooks'a koymayın |
| Encapsulation için asymmetric visibility kullanın | Her property'e hooks eklemeyin |
Bu makalede kullanılan bilgiler aşağıdaki güvenilir kaynaklardan alınmıştır:
Alesta Web olarak tüm bilgileri doğruladık ve test ettik.
Property Hooks, PHP'nin modern programlama dillerine yetişmesi için atılan önemli bir adım. Alesta Web olarak PHP 8.4'e geçmenizi ve bu yeni özellikleri projelerinizde kullanmanızı şiddetle tavsiye ediyoruz.
Bu rehberde öğrendikleriniz / What you learned:
Faydalı Linkler / Useful Links:
© 2026 AlestaWeb - Tüm hakları saklıdır. PHP 8.4 Property Hooks rehberi.