<?php error_reporting(E_ALL); trait Hello { public function sayHello() { echo 'Hello '; } } trait World { public function sayWorld() { echo 'World'; } } class MyHelloWorld { use Hello, World; public function sayExclamationMark() { echo '!'; } } $o = new MyHelloWorld(); $o->sayHello(); $o->sayWorld(); $o->sayExclamationMark();
error_reporting(E_ALL); abstract class Base { public abstract function sayHello(array $a); } class SubClass extends Base { public function sayHello(array $a) { echo "World!\n"; } } $s = new SubClass(); $s->sayHello(array()); trait SayWorld { public function sayHello(Base $d) { echo 'World!'; } } class MyHelloWorld extends Base { use SayWorld; } $o = new MyHelloWorld(); $o->sayHello(array()); ?> --EXPECTF-- Fatal error: Declaration of SayWorld::sayHello() must be compatible with Base::sayHello(array $a) in %s on line %d, position %d
--TEST-- Trait method overriddes base class method --FILE-- <?php error_reporting(E_ALL); class Base { public function sayHello() { echo 'Hello '; } } trait SayWorld { public function sayHello() { echo 'World!'; } } class MyHelloWorld extends Base { use SayWorld; } $o = new MyHelloWorld(); $o->sayHello(); ?> --EXPECTF-- World!
trait Hello { public function say() { echo 'Hello '; } } trait World { public function say() { echo 'World'; } } class MyHelloWorld { use Hello { Hello::say as sayHello; } public function say() { $this->sayHello(); $this->sayWorld(); echo "!\n"; } use World { World::say as sayWorld; } } $o = new MyHelloWorld(); $o->say();
<?php trait Hello { public function sayHello() { echo "Hello"; } } trait World { public function sayWorld() { echo "World"; } } trait HelloWorld { use Hello, World; } class MyHelloWorld { use HelloWorld; } $o = new MyHelloWorld(); $o->sayHello(); $o->sayWorld();
<?php trait MY_TRAIT1 { public function sayHello() { echo 'Hello from MY_TRAIT1!'; } } class MyHelloWorld { use MY_TRAIT1 { MY_TRAIT1::sayHello as falaOi; } } $o = new MyHelloWorld(); $o->falaOi(); ?>
<?php trait MY_TRAIT2 { protected function sayGoodbye() { echo "Goodbye from MY_TRAIT2!\n"; } } class MyHelloWorld { use MY_TRAIT2 { MY_TRAIT2::sayGoodbye as public falaTchau; } } $o = new MyHelloWorld(); $o->falaTchau();
<?php error_reporting(E_ALL); trait Hello { public function saySomething() { echo 'Hello'; } } trait World { public function saySomething() { echo 'World'; } } class MyHelloWorld { use Hello, World { Hello::saySomething insteadof World; } } $o = new MyHelloWorld(); $o->saySomething();
<?php trait MY_TRAIT1 { public function sayHello() { echo "Hello from MY_TRAIT1!\n"; } } trait MY_TRAIT2 { use MY_TRAIT1; public function sayGoodbye() { echo "Goodbye from MY_TRAIT2!\n"; } } class MyHelloWorld { use MY_TRAIT2 { MY_TRAIT2::sayHello as falaOi; MY_TRAIT2::sayGoodbye as falaTchau; } } $o = new MyHelloWorld(); $o->falaOi(); $o->falaTchau(); $o->sayHello(); $o->sayGoodbye();
Express requirements of a trait by abstract methods. --FILE-- <?php error_reporting(E_ALL); trait Hello { public function sayHelloWorld() { echo 'Hello' . $this->getWorld(); } public abstract function getWorld(); } class MyHelloWorld { private $world; use Hello; public function getWorld() { return $this->world; } public function setWorld($val) { $this->world = $val; } } $o = new MyHelloWorld(); $o->setWorld(' World!'); $o->sayHelloWorld(); ?> --EXPECTF-- Hello World!
Use instead to solve a conflict and as to access the method. --FILE-- <?php error_reporting(E_ALL); trait Hello { public function saySomething() { echo 'Hello'; } } trait World { public function saySomething() { echo ' World'; } } class MyHelloWorld { use Hello, World { Hello::saySomething insteadof World; World::saySomething as sayWorld; } } $o = new MyHelloWorld(); $o->saySomething(); $o->sayWorld(); ?> --EXPECTF-- Hello World
<?php trait SayWorld { public function sayHelloWorld() { self::sayHello(); echo 'World!'; } } class MyHelloWorld { use SayWorld; public function sayHello() { echo 'Hello '; } } $o = new MyHelloWorld(); $o->sayHelloWorld(); ?>