【问题标题】:Use a trait conditionally in PHP在 PHP 中有条件地使用特征
【发布时间】:2013-11-05 06:47:29
【问题描述】:

我想在一个类中使用一个特征,只有当一个条件满足时。例如:

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

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

【问题讨论】:

  • 看起来像 XY 问题。告诉我们您的主要问题是什么?
  • 您可以使用use T 创建一个类,它扩展了没有use T 的类。然后在您使用该类的代码中执行 if 并实例化一个或另一个类。
  • 请不要使用你只使用 T 的条件然后检查这些函数并通过异常使用
  • @Asif 听起来很有趣。能给我们举个例子吗?
  • 请看下面我的回答

标签: php traits


【解决方案1】:

您可以使用 use T 创建一个类,该类在不使用 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 */

【讨论】:

  • 我想说的是最简单的解决方案。
【解决方案2】:

您可以将您的条件代码(如调试函数)外包给一个 trait 并执行类似的操作。

//your Trait

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

//your class
class Something{
  use Dbg;
}

【讨论】:

  • 虽然这适用于 PHP7,但 Eclipse IDE (Oxygen 3) 会发出警告“无法声明类型 Dbg,因为该名称已在使用中”。另一种选择是将不同的特征放在不同的文件中,并且只将 require 放在您想要的文件中。
  • 不不,我只运行了你的程序,之前或其他地方没有声明 Dbg。有趣的是,IDE 抱怨您的代码,但 PHP 7.0 没有。您的代码完全有效。
  • 是 IDE 以某种方式保留的 Dbg。你试过不同的特质名称吗?
  • 我刚刚尝试了您的建议,但这并没有改变最新版本的 Eclipse Oxygen 3 + PDT 的想法。不用担心,代码仍然有效,将在 PHP 7+ 中执行而不会出错。
【解决方案3】:

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

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

class Foo extends BaseFoo
{
    // common properties
}

【讨论】:

  • 这是在被调用站点而不是在调用站点或特征内部真正解决它的唯一答案。所以,这就是我投票的原因。
【解决方案4】:
trait T {
function getType() { 
     if($condition){ /*somthing*/ 
          }else{ 
           throw new Exception('some thing.') 
        } }
function getDescription() { /*2*/ }
}
class A {
use T;
/* ... */
}

【讨论】:

  • 好的,这也是一个可能的解决方案。根据 if 条件中的情况,我们中的一个解决方案更有意义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-07
  • 2015-11-23
  • 1970-01-01
相关资源
最近更新 更多