PHP traits - defining generic constants
I ended up using user sectus's suggestion of interfaces as it feels like the least-problematic way of handling this. Using an interface to store constants rather than API contracts has a bad smell about it though so maybe this issue is more about OO design than trait implementation.
interface Definition
{
const SOME_CONST = 'someconst';
const SOME_OTHER_CONST = 'someotherconst';
}
trait Base
{
// Generic functions
}
class A implements Definition
{
use Base;
}
class B implements Definition
{
use Base;
}
Which allows for:
A::SOME_CONST;
B::SOME_CONST;
You could also use static variables. They can be used in the class or the trait itself. - Works fine for me as a replacement for const.
trait myTrait {
static $someVarA = "my specific content";
static $someVarB = "my second specific content";
}
class myCustomClass {
use myTrait;
public function hello()
{
return self::$someVarA;
}
}
To limit the scope of your constants, you can define them inside a namespace:
namespace Test;
const Foo = 123;
// generic functions or classes
echo Foo;
echo namespace\Foo;
A downside of this approach is that autoloading won't work for constants, at least not for 5.4; the typical way around this is to wrap those constants in a static class, i.e.:
namespace Test;
class Bar
{
const Foo = 123;
}
Not a good one, but maybe...
trait Base
{
public static function SOME_CONST()
{
return 'value1';
}
public static function SOME_OTHER_CONST()
{
return 'value2';
}
// generic functions
}
class A
{
use Base;
}
class B
{
use Base;
}
echo A::SOME_CONST();
echo B::SOME_OTHER_CONST();