Backend

PHP Late Static Binding Nedir? Self ve Static Farkı Nedir?

Bu yazı ile Self ve Static kullanımını ve arasındaki farkı öğreneceğiz.

Kadir Bay

Developer

Normalde bir sınıf tanımlarız ve new komutu ile bu sınıftan bir obje oluştururuz. Bu objenin özellik ve metodlarına $this komutu ile erişebiliriz. Örneğin;
php extend object new $this.png
Not: Kodu aynı dizinde “php filename.php” şeklinde çalıştırabiliyoruz.
Not2: PHP_EOL ile bir alt satıra geçiyoruz. Böylece konsolda markaları alt alta düzgün bir şekilde görebiliriz.

Yukarıdaki kod konsola alt alta sırayıla “No Brand” ve “Mercedes” yazacaktır.

Bu hatırlatmadan sonra asıl konumuza geçebiliriz. Sınıfımızın getBrand() metodunu ve $model değişkenini “static” olarak güncelliyoruz. Bu sayede “new” ile yeni bir obje oluşturmadan statik olarak erişebileceğiz. Sınıfımızdan obje türetmediğimiz için atık $this komutunu kullanamıyoruz. Bunun yerine “self” komutunu kullanacağız. Böylece objemizin değil sınıfımızın metod veya özelliklerine erişebileceğiz.
carbon.png
Not: Statik metod ve özelliklere erişim için “->” yerine “::” kullanıyoruz.

Yukarıdaki kodu çalıştırdığımızda konsola sırasıyla “No Brand” ve “No Brand” yazdı. Ne demiştik, self ile sınıfın metod ve özelliklerine erişiriz. Car sınıfından türettiğimiz Mercedes sınıfındaki getModel() metodu Car sınıfından miras kaldı ve bu metod self:: ile erişim sağladığı için Car sınıfımızın $brand özelliğine erişiyor. Eğer Mercedes sınıfındaki $brand’e erişmiş olsaydı konsola “Mercedes” yazacaktı. Peki biz ne istiyoruz?

Mercedes sınıfımızı Car sınıfından türettik. Tüm özellikleri ve metodları miras aldık. $brand özelliğini “Mercedes” olarak güncelledik. Statik olarak erişmek için “static” metod ve özeliklerimizi belirttik. Car sınıfından markaya erişmek için zaten bir metodumuz var ve bu metod bizim işimizi Mercedes sınıfında da aynı şekilde görecek. Bu sınıfta tekrar yazarsak düzgün çalışacaktır ama neden aynı kodu kopyalayıp tekrar tekrar yazalım ki? Bu istenilmeyen durumdur. Bu durumdan kurtulmak için “static::” anahtar kelimesini kullanacağız.

self:: ile sınıfımıza atıfta bulunurken (yani obje değil, sınıfın özellik ve metodlarına erişim), static:: ile methodu çağırdığımız sınıftaki method veya özelliklere atıfta bulunur. Böylece biz Mercedes sınıfında, Car sınıfından miras aldığımız getModel() metodunu çağırdığımızda, Mercedes sınıfıdaki $brand özelliğine erişecek. Çünkü “static:.” anahtar kelimesini kullandık.
carbon (1).png

Kodumuzun çıktısı ise şöyle;
image.png

We are the partners you’ve been searching for.

Tell us about your project.