在PHP中有条件地使用trait

在PHP中有条件地使用trait,php,traits,Php,Traits,我想在一个类中使用一个trait,只要满足一个条件。例如: trait T { } class A { if ($condition) { use T; } } 我知道我不能在课堂上直接使用。因此,我正在寻找一种方法,有条件地使用与上述特征相似的特征。有可能吗?您可以使用use T创建一个类,该类在不使用use T的情况下扩展该类。然后在使用该类的代码中执行if并实例化一个或另一个类 <?php trait T { } class A { } cla

我想在一个类中使用一个trait,只要满足一个条件。例如:

trait T
{
}
class A
{
    if ($condition) {
        use T;
    }
}

我知道我不能在课堂上直接使用
。因此,我正在寻找一种方法,有条件地使用与上述特征相似的特征。有可能吗?

您可以使用use T创建一个类,该类在不使用use T的情况下扩展该类。然后在使用该类的代码中执行if并实例化一个或另一个类

<?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 */

您可以将条件代码(如调试函数)外包到trait中,并执行类似操作

//your Trait

if($isModeDbg){
    trait Dbg{
        function dbg(mssg){
            debugbarOrSomethingSimilar(mssg);
        }
    }
}else{
    trait Dbg{
        function dbg(mssg){
        }
    }
}

//your class
class Something{
  use Dbg;
}

只要您的条件可以在类根中进行评估,您就可以执行以下操作:

if (<condition here>) {
    class BaseFoo
    {
        use FooTrait;
    }
} else {
    class BaseFoo {
    }
}

class Foo extends BaseFoo
{
    // common properties
}
if(){
BaseFoo类
{
使用脚踏板;
}
}否则{
BaseFoo类{
}
}
类Foo扩展了BaseFoo
{
//共同属性
}

看起来像是XY问题。告诉我们您的根本问题是什么?您可以使用
use T
创建一个类,该类在不使用
use T
的情况下扩展该类。然后在使用类的代码中执行if并实例化一个或另一个类。请不要使用您只使用的条件t然后签入这些函数并使用exceptionthrough@Asif听起来很有趣。你能给我们举个例子吗?请看下面我的答案好的,这也是一个可能的解决方案。根据if条件下的情况,我们中的一个解决方案更有意义。我可以说,这是最具nit性的解决方案。虽然它与PHP7一起工作,但Eclipse IDE(oxygen3)警告“无法声明类型Dbg,因为名称已在使用”。另一个选择是将不同的特征放在不同的文件中,并且只需要
require
您想要的特征。不,不,我只运行了您的程序,之前或其他地方没有声明Dbg。有趣的是IDE抱怨了你的代码,但PHP7.0没有。您的代码完全有效。Dbg是IDE以某种方式保留的。你试过不同的特质名称吗?我只是试过你的建议,但这并没有改变最新版本EclipseOxygen3+PDT的想法。不用担心,代码仍然有效,将由PHP7+执行,不会出现错误。这是唯一在被调用站点而不是调用方站点或trait内部真正解决问题的答案。所以,这就是为什么我投了更高的票。
if (<condition here>) {
    class BaseFoo
    {
        use FooTrait;
    }
} else {
    class BaseFoo {
    }
}

class Foo extends BaseFoo
{
    // common properties
}