繁体   English   中英

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

[英]PHP static function as parameter with dependency injection

我想通过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';
        }
      }
    }

}

Start.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();

因此,开始取决于ClassA和ClassB,没关系。

但是我不希望ClassB依赖ClassA。

当我这样做时,我得到了错误,说找不到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']);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM