Traits ni nini?

Miongoni mwa changamoto za inheritance ni kuwa inakuwaga ni moja tu, yaani class haiwezi kurithi kutoka kwenye class zaidi ya moja. Kw alugha rahisi child class haiwezi kurithi kutoka kwenye class zaidi ya moja. Kwenye maisha ya kawaida ni sawa na kusema mtoto hawezi kuwa na mzazi zaidi ya mmoja.

 

Sasa hapo utaona kuna shida, ni kwa sababu mtoto ana wazazi wawili, lamda kwa Yesu, Adamu na Hawa (Eva) ila tuliobakia tuna wazazi wawili. Ukiachana na hiyo pia mtoto anaweza kuridhi baadhi ya sifa kutoka kwa mababu zake na mabibi kupitia kwa wazazi wake. Sasa concept ya inheritance itatulazimisha mtoto arithi kwa mzazi mmoja tu.

 

Traits itatuwezesha sasa child class ku inherit kutoka kwa class zaidi ya moja. Hivyo trait itawezesha method moja iweze kutumika kwenye class zaidi ya  moja. Na method inaweza kuwa na access modifier yryote ile hata kama hiyo method ni abstract. Traits hutengenezawa kwa kutumia keyword trait

Mfano:

<?php

trait gari {

  

}

?>

Ili uweze kutumia trait class utatumia key word use

Mfabno:

<?php

trait gari {

   public function tangazo() {

       echo "Tunauza magari <br>";

   }

   public function mawasiliano() {

       echo "Mawasiliano yetu ni : dukag@gmailcom ";

   }

}

 

class ujumbe {

   use gari;

}

 

class contact {

   use gari;

}

 

$obj = new ujumbe();

$obj->tangazo();

$obj->mawasiliano();

?>

Maelezo zaidi

Hapa ni ufafanuzi wa msimbo wako:

 

1. Traits (gari na duka):

   - Traits ni class inavyoweza kutumika upya katika PHP.

   - Trait `gari` ina method moja, `tangazo1`, ambayo inachapisha ujumbe "tunauza gari aina zote."

   - Trait `duka` ina method nyingine, `tangazo2`, ambayo inachapisha ujumbe "tunatengeneza gari aina zote."

 

2. Classes (mauzo na matengenezo):

   - Class `mauzo` inatumia trait `gari` kupitia use yaani inachukua sifa na method za trait hiyo.

   - Class `matengenezo` inatumia traits zote mbili, `gari` na `duka`, na hivyo inarithi sifa na method zote za hizo traits.

 

3. Matumizi ya Objects:

   - Unajenga object la class `mauzo` na kuita method `tangazo1`, ambayo itachapisha "tunauza gari aina zote."

   - Kisha, unajenga object la class `matengenezo` na kuita method `tangazo2`, ambayo itachapisha "tunatengeneza gari aina zote."

 

Msimbo wako unaonyesha jinsi traits zinavyoweza kutumika kuongeza sifa na method kwa classes mbalimbali bila kubadilisha urithi wa class yenyewe. 

 

Nakuletea mfano mwingie uone jinsi ambavyo class moja inaweza kurithi kutoka class zaidi ya moja

<?php

trait jumlisha{

   public function jumla($var1,$var2){

       return $var1+$var2;

   }

}

trait zidisha {

   public function zao($var1,$var2){

       return $var1*$var2;

   }

}

class mahesabu {

   use jumlisha;

   use zidisha;

   public function kokotoa($var1,$var2){

       echo "juma ya {$var1} na {$var2} ni:".$this->jumla($var1,$var2) ."<br>";

       echo "zao la {$var1} na {$var2} ni:".$this->zao($var1,$var2);

   }

}

$o = new mahesabu();

$o->kokotoa(5,3);

?>

 

 

Mfano zaidi:

<?php
trait a
{
    function hello()
    {
        echo "hello";
    }
}
trait b
{
    use a;
    function world()
    {
       echo $this->hello();
       echo "world";
    }
}
class d
{
    function my()
    {
        echo "my";
    }
}
class c extends d
{
   use a,b;
   function show(){
       $this->hello();
       $this->world();
       $this->my();
   }
}

$play = new c();
$play->show();

Hapo utaona class mahesabu amerithi class jumlisha na class zidisha. Kwahiyo amerith mpaka method zao.

 

Sasa ikitokea trait zaidi ya moja zimetumia method yenye jina moja na ikitaka kuzitumia kwenye class. hapo utatumia keyword instead ama utatumia keyword as ili kutengeneza allias yaani jina la utani.

<?php
trait a
{
    function show()
    {
        echo "hallo world";
    }
}
trait b
{
    function show()
   {
    echo "hello dunia";
    }

}
class c
{
    use a,b{
       a::show insteadof b;
       b::show as chote;
    }
}
$obj=new c();
$obj->show();
echo "<br>";
$obj->chote();

 

hallo world
hello dunia

 

Pia unaweza kubadilisha visibility. Kwa mfano method inaweza kuwa ni private kwenye trait lakini kwenye class ukaibadili kuwa public. Kufanya hivi tutatumia keyword as  mfano show as public; hapa method show itabadilishwa kuwa public.

<?php
trait a
{
    private function show()
    {
        echo "hello word";
    }
}
class b
{
    use a{
        show as public;
    }
}

$obj = new b();
$obj->show();

Mwisho:

Katika somo linalofuata tutakwenda kujifunza kuhusu static  method