Tengo el siguiente código como muestra.
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? } }Podría poner todos los detalles de por qué esto es necesario, pero quiero mantener esta pregunta simple. Extender desde el cliente de clase no es la respuesta aquí debido a mi situación particular.
¿Es posible tener un rasgo que tenga el mismo nombre de función que la clase que lo usa, pero llame a la función de rasgos además de la función de clases?
Actualmente solo usará la función de clases (ya que parece anular los rasgos)
Puedes hacerlo de esta manera:
class client{ use sampletrait { hello as protected sampletrait_hello; } function hello(){ $this->sampletrait_hello(); echo "hello from class"; } }Editar: Vaya, olvidé $ esto-> (gracias JasonBoss)
Edición 2: acabo de investigar un poco sobre las funciones de rasgos de "cambio de nombre".
Si está cambiando el nombre de una función pero no sobrescribiendo otra (vea el ejemplo), ambas funciones existirán (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();Solo puedes cambiar la visibilidad:
trait T{ public function f(){ echo "T"; } } class C{ use T { f as protected; } } $c->f();// Won't workSí, también puede hacerlo de esta manera, puede usar funciones múltiples de un trait como este.
Pruebe este fragmento de código aquí
<?php ini_set('display_errors', 1); trait sampletrait { function hello() { echo "hello from trait"; } } class client { use sampletrait { sampletrait::hello as trait_hello;//alias method } function hello() { $this->trait_hello(); echo "hello from class"; } }