ROHAN2 WORLD 1-120 TR TİPİ OFFICIAL YOHARA, BALATHOR VE AMON! 80. GÜNÜNDE! +10.000 ONLİNE! HİLE VE BOT %100 ENGELLİ HEMEN TIKLA!
PHP'de bir sınıf yalnızca bir üst sınıftan miras alabilir, PHP'de çoklu miras tanımlanmamıştır. Bu sınırlamayı aşmak için PHP'de nitelikler tanıtılmıştır. Bir nitelikte bir veya daha fazla yöntem tanımlayabilirsiniz, bu çeşitli bağımsız sınıflarda özgürce yeniden kullanılabilir.
Sözdizimi
"Trait" anahtar kelimesi aşağıdaki sözdizimine göre kullanılır:
trait mytrait {
function method1() {
/*function body*/
}
Bir özellikteki metotları çağırabilmek için, use anahtar sözcüğü ile başka bir sınıfa sunulması gerekir.
Örnek
Bir Trait, bir sınıfa benzer, ancak yalnızca işlevselliği ince taneli ve tutarlı bir şekilde gruplandırmak için tasarlanmıştır. Bir Trait'i kendi başına örneklendirmek mümkün değildir.
PHP:
<?php
trait mytrait {
public function hello() {
echo "Hello World from " . __TRAIT__ . "";
}
}
class myclass {
use mytrait;
}
$obj = new myclass();
$obj->hello();
?>
Bir özellik birden fazla sınıfta kullanılabilir. Aşağıdaki örnekte avg() fonksiyonu int it olan bir mytrait vardır. Bir marks sınıfının içinde kullanılır. percentage() metodu dahili olarak özellikten avg() fonksiyonunu çağırır.
Aşağıdaki örneğe bir göz atın.
PHP:
<?php
trait mytrait {
function avg($x, $y) {
return ($x+$y)/2;
}
}
class marks {
use mytrait;
private int $m1, $m2;
function __construct($x, $y) {
$this->m1 = $x;
$this->m2 = $y;
}
function percent():float {
return $this->avg($this->m1, $this->m2);
}
}
$obj = new marks(50, 60);
echo "percentage: " . $obj->percent();
?>
Bir sınıf birden fazla özellik kullanabilir. Burada her biri iki sayının toplama ve çarpmasını gerçekleştiren bir işleve sahip iki özelliğimiz var. Her ikisi de üçüncü bir sınıfın içinde kullanılır.
PHP:
<?php
trait addition {
function add($x, $y) {
return $x+$y;
}
}
trait multiplication {
function multiply($x, $y) {
return $x*$y;
}
}
class numbers {
use addition, multiplication;
private int $m1, $m2;
function __construct($x, $y) {
$this->m1 = $x;
$this->m2 = $y;
}
function calculate():array {
$arr = [$this->add($this->m1, $this->m2), $this->multiply($this->m1, $this->m2)];
return $arr;
}
}
$obj = new numbers(50, 60);
$res = $obj->calculate();
echo "Addition: " . $res[0] . PHP_EOL;
echo "Multiplication: " . $res[1] . PHP_EOL;
?>
Bir sınıf belirli bir özelliği kullandığında, onun işlevi tıpkı bir çocuk sınıfın ebeveyn yöntemlerini miras alması gibi ona açıktır. Özellik işlevi ayrıca geçersiz kılınabilir.
PHP:
<?php
trait mytrait {
public function sayHello() {
echo 'Hello World!';
}
}
class myclass {
use mytrait;
public function sayHello() {
echo 'Hello PHP!';
}
}
$o = new myclass();
$o->sayHello();
?>
Bazen, iki özellikten daha fazlası aynı fonksiyon adına sahip olabilir. Bu nedenle, bunları bir sınıfta kullanmak belirsiz bir durum yaratır. PHP, ayrıştırıcı fonksiyona hangi özelliği kullanmayı düşündüğünüzü söylemek için Insteadof anahtar sözcüğünü sağlar.
PHP:
<?php
trait mytrait {
public function sayHello() {
echo 'Hello World!';
}
}
trait newtrait {
public function sayHello() {
echo 'Hello PHP!';
}
}
class myclass {
use mytrait, newtrait{
newtrait::sayHello insteadof mytrait;
}
}
$o = new myclass();
$o->sayHello();
?>
Aynı isimli fonksiyona sahip olsalar bile her iki özellikten de fonksiyonları çağırabilmek istiyorsanız, bir çözüm yolu olarak bunlardan birine takma ad belirtebilirsiniz.
Örnek
Aşağıdaki örnekte sayHello()'yu mytrait'ten hello() olarak çağıracağız.
PHP:
<?php
trait mytrait {
public function sayHello() {
echo 'Hello World!' . PHP_EOL;
}
}
trait newtrait {
public function sayHello() {
echo 'Hello PHP!' . PHP_EOL;
}
}
class myclass {
use mytrait, newtrait{
mytrait::sayHello as hello;
newtrait::sayHello insteadof mytrait;
}
}
$o = new myclass();
$o->hello();
$o->sayHello();
?>