2016-03-29 4 views
0

クラスBの静的関数をパラメータとしてStart.php経由で渡しますが、ClassB.phpにClassA.phpを含めずに静的関数を呼びたいと思います。依存性注入を伴うパラメータとしての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(); 

ので、スタートはそれはOKだ、にClassAとClassBのに依存します。

しかし、私はClassBがClassAに依存しないようにしたいと思います。

このようにすると、クラスAが見つからないというエラーが表示されます。

これは可能ですか?それは良い練習とみなされていますか?

+0

は、「しかし、私はClassBのはにClassAに依存する必要はありません。」 ClassBでClassAを使用する場合、ClassBはClassAに依存します。 – n00dl3

+0

autoloadを使うと、必要に応じてクラスを読み込むことができます。 – n00dl3

+0

おそらく、これをインターフェイスを使って実装できます。 – AmazingDreams

答えて

0

ここでこの動作を確認することができます

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

あなたはこれを間違った方法で行っていると思います。実際、ここで使用している構文はPHP7で変更されています。さんがアップ

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

これをきれいにしましょうそれでは、私たちは、正確なcall_user_func機能を使用して、それを呼び出して直接、あなたの配列内の静的関数を使用するためにPHPを伝えるとしているされ、ここでやっている(これがベストプラクティスと考えられています) 。あなたの呼び出しは常に静的であると仮定していましたが、それはあなたがそのように渡すどのクラスでも機能します。

あなたはので、私は関数呼び出しへの完全な名前空間を提供しなければならなかったhttps://3v4l.org/WpeiD

+0

その仕事だ! ;-) しかし、私の作品も。私は呼び出しに完全な名前空間を提供しなければならなかった –