簡體   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