在PHP中有条件地使用trait
我想在一个类中使用一个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 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
}