Skip to content

Instantly share code, notes, and snippets.

@Glutexo
Last active January 24, 2018 07:23
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Glutexo/f0fb3d5fadd8958791c0890c8bd93f96 to your computer and use it in GitHub Desktop.
Save Glutexo/f0fb3d5fadd8958791c0890c8bd93f96 to your computer and use it in GitHub Desktop.
Demonstration of a strange PHP behavior concerning class definition order when nested traits are used
<?php
class MyClass
{
use MyFirstTrait;
}
// This does not work. MyFirstTrait should use MySecondTrait, "Fatal error:
// Trait 'MyFirstTrait' not found" is raised instead.
trait MyFirstTrait
{
use MySecondTrait;
/**
* @return string
*/
public function first(): string
{
return __METHOD__;
}
}
trait MySecondTrait {
/**
* @return string
*/
public function second(): string
{
return __METHOD__;
}
}
$myInstance = new MyClass;
var_dump($myInstance->first());
<?php
// This works. The use clause in MyFirstTrait is commented out, only one trait
// is used.
class MyClass
{
use MyFirstTrait;
}
trait MyFirstTrait
{
// use MySecondTrait;
/**
* @return string
*/
public function first(): string
{
return __METHOD__;
}
}
trait MySecondTrait {
/**
* @return string
*/
public function second(): string
{
return __METHOD__;
}
}
$myInstance = new MyClass;
var_dump($myInstance->first());
<?php
// This works. MyClass is now defined after the traits.
trait MyFirstTrait
{
use MySecondTrait;
/**
* @return string
*/
public function first(): string
{
return __METHOD__;
}
}
trait MySecondTrait {
/**
* @return string
*/
public function second(): string
{
return __METHOD__;
}
}
class MyClass
{
use MyFirstTrait;
}
$myInstance = new MyClass;
var_dump($myInstance->first());
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment