Özellikler

Sınıf üyesi değişkenlere özellik denir. Bunlara bazan öznitelik veya alan dendiği de olur, fakat bu kılavuzun amaçları doğrultusunda biz özellik terimini kullanacağız. PHP 7.4 itibariyle, özellikler normal değişken bildiriminin önüne isteğe bağlı (Görünürlük sözcüklerinden biri, language.oop5.static.php veya PHP 8.1.0 itibariyle readonly gibi) bir değiştirici ve ardından isteğe bağlı bir tür belirtimi getirilerek bildirilir. Bu bildirim, bir ilklendirme olarak da yapılabilir; bu durumda sabit bir değerle ilklendirme yapılmalıdır.

Bilginize:

Sınıf özelliklerini bildirmenin artık kullanılmayan bir yolu da, bu değiştiriciler yerine var sözcüğünü kullanmaktır.

Bilginize: Görünürlük sözcüklerinden biri kullanılmadan bildirilen bir özellik public olarak bildirilmiş olur.

Statik olmayan özelliklere, yöntemleri içinden -> (Nesne İşleci): $this->özellik (burada özellik özelliğin ismidir) kullanarak erişilir. Statik özelliklere ise :: (Çift İki nokta imi): self::özellik kullanarak erişilir. Statik ve statik olmayan özellikler arasıdaki fark hakkında daha ayrıntılı bilgi için static Anahtar Sözcüğü bölümüne bakınız.

Yöntem bir nesne bağlamından çağrılıyorsa $this sözde değişkeni sınıf yöntemleri içinde de kullanılabilir. $this, yöntemi çağıran nesnenin değeridir.

Örnek 1 - Özellik bildirimi

<?php
class SimpleClass
{
public
$var1 = 'hello ' . 'world';

public
$var2 = <<<EOD
hello world
EOD;
public
$var3 = 1+2;

// geçersiz özellik bildirimleri:
public $var4 = self::myStaticMethod();
public
$var5 = $myVar;

// geçerli özellik bildirimleri:
public $var6 = myConstant;
public
$var7 = [true, false];

public
$var8 = <<<'EOD'
hello world
EOD;

// Örtük public bildirim:
static $var9;
readonly
int $var10;
var
$var11;
}
?>

Bilginize:

Sınıflar ve nesnelerle çalışan bazı işlevler vardır. Bunlar için Sınıf ve Nesne İşlevleri bölümüne bakınız.

Tür Bildirimleri

PHP 7.4.0 ve sonrasında özellik tanımı callable istisnası ile tür bildirimi içerebilmektedir.

Örnek 2 - Tür ile özellik bildirimi

<?php

class User
{
public
int $id;
public ?
string $name;

public function
__construct(int $id, ?string $name)
{
$this->id = $id;
$this->name = $name;
}
}

$user = new User(1234, null);

var_dump($user->id);
var_dump($user->name);

?>

Yukarıdaki örneğin çıktısı:

 int(1234) NULL 

Tür bildirimli özellikler erişilmeden önce ilklendirilmelidir, aksi takdirde bir Error yavrulanır.

Örnek 3 - Özelliklere erişim

<?php

class Shape
{
public
int $numberOfSides;
public
string $name;

public function
setNumberOfSides(int $numberOfSides): void
{
$this->numberOfSides = $numberOfSides;
}

public function
setName(string $name): void
{
$this->name = $name;
}

public function
getNumberOfSides(): int
{
return
$this->numberOfSides;
}

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

$triangle = new Shape();
$triangle->setName("triangle");
$triangle->setNumberofSides(3);
var_dump($triangle->getName());
var_dump($triangle->getNumberOfSides());

$circle = new Shape();
$circle->setName("circle");
var_dump($circle->getName());
var_dump($circle->getNumberOfSides());
?>

Yukarıdaki örneğin çıktısı:

 string(8) "triangle" int(3) string(6) "circle" Fatal error: Uncaught Error: Typed property Shape::$numberOfSides must not be accessed before initialization 

Salt-okunur Özellikler

PHP 8.1.0 itibariyle, bir özellik readonly ile bildirilebilmekte ve böylece ilklendirmeden sonra özellik üzerinde değişiklik yapılması engellenebilmektedir.

Örnek 4 - Salt-okunur özellik örneği

<?php

class Test {
public readonly
string $prop;

public function
__construct(string $prop) {
// Geçerli ilklendirme
$this->prop = $prop;
}
}
// dolaylı ilklendirme
$test = new Test("foobar");
// Geçerli değerin okunması
var_dump($test->prop); // string(6) "foobar"

// Geçersiz atama. Aynı değer yeniden atanıyor olsa bile geçerli değil.
$test->prop = "foobar";
// Hata: Salt-okunur özellik Test::$prop üzerinde değişiklik yapılamaz
?>

Bilginize:

readonly betimleyicisi sadece özelliklere veri türü bildirimi yapılırken uygulanabilir. Bir salt-okunur özelliği veri türü kısıtlaması olmaksızın bildirmek için mixed türü kullanılabilir.

Bilginize:

Salt-okunur statik özellikler desteklenmemektedir.

Bir salt-okunur özellik yalnızca bir kere, sadece bildirildiği bağlamda ilklendirilebilir ve bunun dışındaki her türlü ilklendirme ya da değişiklik hata ile sonuçlanır (Error istisnası yavrulanır).

Örnek 5 - Salt-okunur özelliklerde hatalı ilklendirme örneği

<?php
class Test1 {
public readonly
string $prop;
}

$test1 = new Test1;
// Özel bağlamı dışında (küresel bağlamda) ilklendirme hatası
$test1->prop = "foobar";
// Error: Cannot initialize readonly property Test1::$prop from global scope
?>

Bilginize:

Salt-okunur özelliklerde öntanımlı değerin açıkça belirtilmesine izin verilmez. Çünkü, salt-okunur bir özelliği bir değerle bildirmek, özünde bir sabitten farksız olduğundan bu yararsızdır.

<?php

class Test {
// Ölümcül hata: Salt-okunur özellik Test::$prop öntanımlı değere sahip olamaz
public readonly int $prop = 42;
}
?>

Bilginize:

Salt-okunur özellikler ilklendirildikten sonra unset() gibi bir işlevle yok edilemez. Bu ancak, özelliğin bildirildiği bağlamda, ilklendirilmeden önce mümkündür.

Aşağıdaki gibi düz atamalarla yapılmayan değişiklikler de Error istisnasına yol açar:

<?php

class Test {
public function
__construct(
public readonly
int $i = 0,
public readonly array
$ary = [],
) {}
}

$test = new Test;
$test->i += 1;
$test->i++;
++
$test->i;
$test->ary[] = 1;
$test->ary[0][] = 1;
$ref =& $test->i;
$test->i =& $ref;
byRef($test->i);
foreach (
$test as &$prop);
?>

Bununla birlikte salt-okunur özellikler, içerik değişikliğini engellemez. Nesneler (veya özkaynaklar) salt-okunur özelliklerde saklansa bile içerikleri değiştirilebilir:

<?php

class Test {
public function
__construct(public readonly object $obj) {}
}

$test = new Test(new stdClass);
// Geçerli içerik değişikliği.
$test->obj->foo = 1;
// Geçersiz atama
$test->obj = new stdClass;
?>

Dinamik özellikler

Bir nesnede mevcut olmayan bir özelliğe atama yapılmaya çalışılırsa PHP olmayan özelliği otomatik olarak oluşturmaya çalışır. Böyle dinamik olarak oluşturulan bir özellik sınıfın yalnızca bu nesnesinde kullanılabilir.

Uyarı

PHP 8.2.0 ve sonrasında dinamik özelliklerin kullanımı önerilmemektedir. Özelliğe atama yapmadan önce bildirilmesi önerilir. Keyfi özellik isimlerini işleme sokabilmek için sınıfın sihirli __get() ve __set() yöntemlerini gerçeklemesi gerekir. Son çare olarak, sınıf #[\AllowDynamicProperties] özelliği ile imlenebilir.

To Top