Reputation: 1651
I want to use a trait in a class, only if a condition is satisfied. For example:
trait T
{
}
class A
{
if ($condition) {
use T;
}
}
I know I can't use if
directly in class. So, I'm looking for a way to use traits conditionally similar to the above. Is it possible?
Upvotes: 18
Views: 8400
Reputation: 5889
You can create a class with use T which extends the class without use T. And then in your code where you use the class do an if and instantiate the one or the other class.
<?php
trait T {
}
class A {
}
class B extends A {
use T;
}
// In an other part of code
$obj = null;
if($condition) {
$obj = new B();
} else {
$obj = new A();
}
/* EOF */
Upvotes: 15
Reputation: 9575
As long as your condition can be evaluated at the class root, you can do the following:
if (<condition here>) {
class BaseFoo
{
use FooTrait;
}
} else {
class BaseFoo {
}
}
class Foo extends BaseFoo
{
// common properties
}
Upvotes: 6
Reputation: 179
You can outsource your conditional code (like debug-functions) in a trait and do something like that.
//your Trait
if($isModeDbg){
trait Dbg{
function dbg(mssg){
debugbarOrSomethingSimilar(mssg);
}
}
}else{
trait Dbg{
function dbg(mssg){
}
}
}
//your class
class Something{
use Dbg;
}
Upvotes: 3
Reputation: 647
trait T {
function getType() {
if($condition){ /*somthing*/
}else{
throw new Exception('some thing.')
} }
function getDescription() { /*2*/ }
}
class A {
use T;
/* ... */
}
Upvotes: 1