【问题标题】:PHP static function as parameter with dependency injectionPHP静态函数作为依赖注入的参数
【发布时间】:2016-03-31 23:19:06
【问题描述】:

我想通过 Start.php 作为参数在 B 类中调用 A 类的静态函数,但不将 ClassA.php 包含到 ClassB.php 中。

我想这样做的原因是因为我有一些特定于客户端的逻辑,我想分离并集中调用,并且仅在我真正需要它时(index.php)而不将其包含在其他文件中。

假设我有 3 个文件。

Start.php, ClassA.php, ClassB.php

ClassA.php

class A {

  public static function foo($param) {
    // do some special logic
    // and return either true or false
  }

}

ClassB.php

class B {

    function bar($var, $func) {
      foreach($var as $v) {
        if($func($var)) {
          echo 'OK';
        }
      }
    }

}

开始.php

require_once('ClassA.php');
require_once('ClassB.php');

class Start() {

  function init() {
    $b = new B();
    $test = array(1,2,3,4,5);
    $b->bar($test, ['A', 'foo']);
  }
}

Start::init();

所以,Start 取决于 ClassA 和 ClassB,没关系。

但我不希望 ClassB 依赖于 ClassA。

当我这样做时,我收到错误,说找不到 A 类。

这可能吗?这甚至被认为是一种好的做法吗?

【问题讨论】:

  • "但我不希望 ClassB 依赖于 ClassA。"但是如果你在 ClassB 中使用 ClassA,ClassB 依赖于 ClassA。
  • 使用自动加载,您可以按需加载类。
  • 也许你可以使用接口来实现。
  • 有趣...我刚刚复制粘贴了您的代码(仅将 class Start(){} 更改为 class Start{}),一切正常。我使用 php 5.4.45

标签: php function static dependencies code-injection


【解决方案1】:

我认为你的做法是错误的。实际上,您在此处使用的语法在 PHP7 中已更改。让我们把它清理干净

class B {
    function bar($var, $func) {
      $method = $func[0] . '::' . $func[1];
      foreach($var as $v) {
        if(call_user_func($method, $v)) {
          echo 'OK';
        }
      }
    }
}

所以我们在这里所做的是告诉 PHP 使用数组中的静态函数,然后使用精确的 call_user_func 函数直接调用它(这被认为是最佳实践)。请注意,我假设您的调用将始终是静态的,但它适用于您以这种方式传递的任何类。

你可以在这里看到这个https://3v4l.org/WpeiD

【讨论】:

  • 干得好! ;-) 但是我的也可以。我必须为调用提供完整的命名空间
【解决方案2】:

我必须为函数调用提供完整的命名空间,所以:

$b->bar($test, ['my\\namespace\\A', 'foo']);

【讨论】:

    猜你喜欢
    • 2018-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-06
    • 2016-01-26
    相关资源
    最近更新 更多