php traits php-5.5

php - Colisiones con otros métodos de rasgo.



traits php-5.5 (1)

¿Cómo puedo lidiar con los rasgos con métodos del mismo nombre?

trait FooTrait { public function fooMethod() { return ''foo method''; } public function getRow() { return ''foo row''; } } trait TooTrait { public function tooMethod() { return ''too method''; } public function getRow() { return ''too row''; } } class Boo { use FooTrait; use TooTrait; public function booMethod() { return $this->fooMethod(); } }

error,

Error fatal: el método de rasgo getRow no se ha aplicado, porque hay colisiones con otros métodos de rasgo en Boo en ...

¿Qué debo hacer al respecto?

Y también, con dos nombres de métodos iguales, ¿cómo puedo obtener el método de la trait FooTrait ?

$a = new Boo; var_dump($a->getRow()); // Fatal error: Call to undefined method Boo::getRow() in...

Editar:

class Boo { use FooTrait, TooTrait { FooTrait::getRow insteadof TooTrait; } public function booMethod() { return $this->fooMethod(); } }

¿Qué getRow si también deseo obtener el método getRow de TooTrait través de Boo ? ¿Es posible?


Documentación PHP sobre conflictos:

Si dos Rasgos insertan un método con el mismo nombre, se produce un error fatal, si el conflicto no se resuelve explícitamente.

Para resolver los conflictos de nombres entre los Rasgos utilizados en la misma clase, el operador en lugar de uno debe usarse para elegir exactamente uno de los métodos en conflicto.

Como esto solo permite excluir métodos, el operador as se puede usar para permitir la inclusión de uno de los métodos en conflicto bajo otro nombre.

Ejemplo # 5 Resolución de Conflictos

En este ejemplo, Talker usa los rasgos A y B. Como A y B tienen métodos conflictivos, define usar la variante de smallTalk del rasgo B, y la variante de bigTalk del rasgo A.

Aliased_Talker hace uso del operador as para poder usar la implementación bigTalk de B bajo una charla de alias adicional.

<?php trait A { public function smallTalk() { echo ''a''; } public function bigTalk() { echo ''A''; } } trait B { public function smallTalk() { echo ''b''; } public function bigTalk() { echo ''B''; } } class Talker { use A, B { B::smallTalk insteadof A; A::bigTalk insteadof B; } } class Aliased_Talker { use A, B { B::smallTalk insteadof A; A::bigTalk insteadof B; B::bigTalk as talk; } }

Así que en tu caso podría ser

class Boo { use FooTrait, TooTrait { FooTrait::getRow insteadof TooTrait; } public function booMethod() { return $this->fooMethod(); } }

( Funciona incluso si hace use separado, pero creo que es más claro )

O use el as para declarar un alias.