Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PHP Class Using Same Name as Trait Function

Tags:

php

traits

I have the following code as a sample.

trait sampletrait{
   function hello(){
      echo "hello from trait";
   }
}

class client{
   use sampletrait;

   function hello(){
      echo "hello from class";
      //From within here, how do I call traits hello() function also?
   }
}

I could put all the details as to why this is necessary but I want to keep this question simple. Extending from the class client is not the answer here due to my particular situation.

Is it possible to have a trait have the same function name as the class using it, but call the traits function in addition to the classes function?

Currently it will only use the classes function (as it seems to override the traits)

like image 648
Joseph Astrahan Avatar asked Apr 30 '17 02:04

Joseph Astrahan


1 Answers

You can do it this way :

class client{
   use sampletrait {
       hello as protected sampletrait_hello;
   }

   function hello(){
      $this->sampletrait_hello();
      echo "hello from class";
   }
}

Edit : Whops, forgot $this-> (thanks JasonBoss)

Edit 2 : Just did some research on "renaming" trait functions.

If you are renaming a function but not overwriting another one (see the example), both functions will exist (php 7.1.4) :

trait T{
    public function f(){
        echo "T";
    }
}

class C{
    use T {
        f as public f2;
    }
}

$c = new C();
$c->f();
$c->f2();

You can only change the visibility :

trait T{
    public function f(){
        echo "T";
    }
}

class C{
    use T {
        f as protected;
    }
}

$c->f();// Won't work
like image 196
Alex van Vliet Avatar answered Sep 20 '22 02:09

Alex van Vliet