PHP静态函数作为带有依赖项注入的参数


PHP static function as parameter with dependency injection

我想调用B类中a类的静态函数,方法是将其作为参数通过Start.php传递,但不将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,这没关系

但我不希望B班依赖A班。

当我这样做的时候,我会出错,说找不到A类。

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

我认为你的做法不对。事实上,您在这里使用的语法在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

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

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