Reševanje konfliktov metod lastnosti v OOP v PHP

Ker lahko en razred uporablja več lastnosti, se lahko pojavi težava, ko imata dve lastnosti metode z enakim imenom.

V tem primeru bo PHP izpisal usodno napako. Da popravimo situacijo, bomo morali konflikt imen eksplicitno razrešiti. Kako se to naredi - poglejmo v praksi.

Recimo, da imamo dve lastnosti z enako metodo method:

php<?php
  trait Trait1
  {
    private function method()
    {
      return 1;
    }
  }
  
  trait Trait2
  {
    private function method()
    {
      return 2;
    }
  }
?>

Recimo, da imamo tudi razred Test, ki uporablja obe naš lastnosti. Če preprosto povežemo obe lastnosti z našim razredom, bo PHP izpisal napako, ker imata lastnosti metode, ki se ujemajo:

php<?php
  // Ta koda bo sprožila napako!
  class Test
  {
    use Trait1, Trait2; // povežemo lastnosti
  }
?>

Razrešimo konflikt imen naših lastnosti. Za to obstaja poseben operator insteadof. S tem operatorjem bomo uporabili metodo method lastnosti Trait1 namesto podobne metode lastnosti Trait2:

php<?php
  class Test
  {
    use Trait1, Trait2 {
      Trait1::method insteadof Trait2;
    }
  }
  
  new Test;
?>

Kot vidite, je sintaksa naslednja: najprej ime lastnosti, nato dva dvopičja, nato ime metode, nato naš operator insteadof in ime druge lastnosti.

Preverimo:

php<?php
  class Test
  {
    use Trait1, Trait2 {
      Trait1::method insteadof Trait2;
    }
    
    public function __construct()
    {
      echo $this->method(); // izpiše 1, ker je to metoda prve lastnosti
    }
  }
  
  new Test;
?>

Torej, v našem razredu smo rekli, da če se uporablja metoda method, je treba jo vzeti iz prve lastnosti. Lahko je tudi obratno - vzemite metodo druge lastnosti:

php<?php
  class Test
  {
    use Trait1, Trait2 {
      Trait2::method insteadof Trait1;
    }
    
    public function __construct()
    {
      echo $this->method(); // izpiše 2, ker je to metoda druge lastnosti
    }
  }
  
  new Test;
?>

V vsakem primeru, če navedemo, da uporabljamo metodo ene lastnosti, potem metoda druge lastnosti postane nedostopna. Lahko uporabimo tudi metodo druge lastnosti, tako da jo preimenujemo z ključno besedo as, takole:

php<?php
  class Test
  {
    use Trait1, Trait2 {
      Trait1::method insteadof Trait2;
      Trait2::method as method2;
    }
    
    public function __construct()
    {
      echo $this->method() + $this->method2(); // izpiše 3
    }
  }
  
  new Test;
?>

Po želji lahko preimenujete tudi metodo prve lastnosti:

php<?php
  class Test
  {
    use Trait1, Trait2 {
      Trait1::method insteadof Trait2;
      Trait1::method as method1;
      Trait2::method as method2;
    }
    
    public function __construct()
    {
      echo $this->method1() + $this->method2(); // izpiše 3
    }
  }
  
  new Test;
?>

Uporaba ključne besede as brez določanja glavne metode z insteadof ni dovoljena, to bo povzročilo napako:

php<?php
  // Ta razred bo sprožil napako:
  class Test
  {
    use Trait1, Trait2 {
      Trait1::method as method1;
      Trait2::method as method2;
    }
    
    public function __construct()
    {
      echo $this->method1() + $this->method2();
    }
  }
  
  new Test;
?>
Задание 1

Naredite 3 lastnosti z imeni Trait1, Trait2 in Trait3. Naj bo v prvi lastnosti metoda method, ki vrne 1, v drugi lastnosti - metoda z enakim imenom, ki vrne 2, v tretji lastnosti pa - metoda z enakim imenom, ki vrne 3.

Задание 2

Naredite razred Test, ki uporablja vse tri ustvarjene lastnosti. Naredite v tem razredu metodo getSum, ki vrne vsoto rezultatov metod priključenih lastnosti.