Method çakışması çözümü
Aynı method adına sahip trait'lerde insteadof ve as ile çakışmayı çözmeni öğrenirsin.
Aynı method adında çakışma
İki trait aynı isimde metot içeriyorsa ve ikisini birden use edersen PHP önemli hata (fatal error) verir. Çakışmayı insteadof ile çözersin: hangi trait'in metodu kazanacağını seçersin.
class Report {
use XmlReporter, CsvReporter {
XmlReporter::format insteadof CsvReporter;
}
}Burada format() çağrısı XmlReporter'ın metodunu kullanır; CsvReporter'ın metodu bastırılır.
as ile yeniden adlandırma (alias)
Bazen çakışan metodun kaybolmasını değil, farklı bir adla erişilebilir kalmasını istersin. Bunun için as kullanırsın: metoda bir takma ad (alias) verirsin.
use XmlReporter, CsvReporter {
XmlReporter::format insteadof CsvReporter;
CsvReporter::format as asCsv;
}Artık $r->format() XML döndürür, $r->asCsv() ise CSV döndürür. İki metot da erişilebilir.
Uygulama XmlReporter ve CsvReporter çakışmasını çöz
Bir XmlReporter trait'i tanımla: public function format(): string metodu return "XML"; döndürsün. Bir CsvReporter trait'i tanımla: public function format(): string metodu return "CSV"; döndürsün. Sonra Report sınıfı ikisini kullansın ve use bloğunda XmlReporter::format insteadof CsvReporter; ile CsvReporter::format as asCsv; yaz. $r = new Report() ile echo $r->format() . "\n" ve echo $r->asCsv() . "\n" çağrılarını yaz.
Örnek çözümü göster
:format insteadof CsvReporter; CsvReporter::format as asCsv; } } ekle.
Örnek çözüm:
<?php
// XmlReporter ve CsvReporter çakışmasını insteadof ve as ile çöz
trait XmlReporter {
public function format(): string {
return "XML";
}
}
trait CsvReporter {
public function format(): string {
return "CSV";
}
}
class Report {
use XmlReporter, CsvReporter {
XmlReporter::format insteadof CsvReporter;
CsvReporter::format as asCsv;
}
}
$r = new Report();
echo $r->format() . "\n";
echo $r->asCsv() . "\n";
Kendini test et
-
Hangi anahtar kelime trait metod çakışmasını çözer?
- override
- parent::
- insteadof
- final
Cevabı göster
insteadof — Doğru. insteadof, çakışan iki trait'ten hangisinin metodunun kazanacağını seçer.
-
insteadof ile çakışmayı çöz
trait CacheA { public function store() { return "A"; } } trait CacheB { public function store() { return "B"; } } class Repo { use CacheA, CacheB { CacheA::store ____ CacheB; } } $r = new Repo(); echo $r->store() . "\n";Cevabı göster
trait CacheA { public function store() { return "A"; } } trait CacheB { public function store() { return "B"; } } class Repo { use CacheA, CacheB { CacheA::store insteadof CacheB; } } $r = new Repo(); echo $r->store() . "\n"; -
CacheA::store insteadof CacheB; sonrası $r->store() ne döndürür?
- A
- B
- Önemli hata (fatal error)
- null
Cevabı göster
A — Doğru. insteadof CacheA'yı kazanan yapar; bu yüzden $r->store() A döndürür.