2016-11-18 2 views
0

私はクラスを持っているので、classAのメソッドをclassBのコンストラクタに渡し、後で実行するようにclassBのインスタンス変数に格納したいと思います。私はエラーを取得しているようにそれを実行しようとするとPassメソッド後で2番目のクラスに実行するための異なるクラス



    class A 
    { 
     public function execute() 
     { 
      $ClassB = new ElgEmpAnalyticsImporterControllerImporterEmporioOrder(ConMW::getDB(), $this -> lPointFile, [$this, 'getLastPoints']); 
      $ClassB -> import(); 
     } 

     public function getLastPoints(Array $keys) 
     { 
      $res = []; 
      forEach (json_decode(file_get_contents($this -> lastPointFile)) as $key => $value): 
       if (in_array($key, $keys)): 
        $res[$key] = $value; 
       else: 
        $res[$key] = ''; 
       endif; 
      endforeach; 
      unset($key); 
      unset($value); 
      return $res; 
     } 

    } 


    classB 
    { 
     public $getLastPoints = null; 

     public function __construct(callable $getLastPoints) 
     { 
      $this -> getLastPoints = $getLastPoints; 
     } 

     public function import() 
     { 
      $lastPoints = $this -> getLastPoints(['idOrder', 'orderLastExport']);    
     } 
    } 

「未定義のメソッドgetLastPointsの呼び出し()」

私は問題はClassBのインスタンス変数$ getLastPoints上の機能を格納上だと思います。私はこれを終えることができます。なぜなら私がコンストラクタで関数を実行すると、それは機能します。つまり、このようなクラスBのコンストラクタを変更すると、



    classB 
    { 
     public $getLastPoints = null; 

     public function __construct(callable $getLastPoints) 
     { 
      $getLastPoints(['idOrder', 'orderLastExport']); 
     } 


    } 

が動作します。

しかし、私は必要なのは、インポート関数内で外部関数を実行することです。

誰かお手伝いできますか?お時間を

おかげで、明確化のため

編集:私はこのようなコンストラクタ内の機能を実行することができますなぜ私の質問は次のとおりです。

$lastPoint(a,b) 

が、私のようなインスタンス変数に呼び出し可能に割り当てますこれは

動作しません。

私は、phpが変数と機能に異なるストレージを使用していると読んでいます。 PHPはおそらくcallable $ lastPointsを変数として見ます。だから、呼び出し可能な$ lastPointsは、classBのインスタンスに動的関数として追加できますか?

Christoforos

+2

これは本当の 'ElgEmpAnalyticsImporterControllerImporterEmporterOmder'ですか? – AbraCadaver

+0

変数内のgetLastPoints()メソッドの値をクラスAに格納し、新しいBオブジェクトを作成するときにその変数を渡します。 –

+0

残念です。AbraCadaver ElgEmpAnalyticsImporterControllerImporterEmporioOrderはClassBです – Christoforos

答えて

0

PHP Callable Object as Object Member

$ getlastpointsそれに格納された配列の値を持つプロパティではない機能です。 call_user_func_array($ this-> getlastpoints、['idOrder'、 'orderLastExport']);

public function import() 
    { 
     $my_func = $this->getLastPoints; 
     $lastPoints = $my_func(['idOrder', 'orderLastExport']);    
    } 

簡単に言えば、これは、同じ名前のPHPクラスでプロパティとメソッドを定義できるためです。例えば

class foo { 
    public $bar 
    public function bar() {} 
} 

したがって、この例では、$ barプロパティに格納された呼び出し可能コードに直接アクセスすることが許可されているとします。

$my_foo_obj->bar() 

これを回避するには、直接呼び出すことはできません。

+0

申し訳ありませんが、 "getLastPoints()は配列型の文字列でなければなりません"というエラーが表示されます。 $ lastPoint(a、b)のような構造の中で私はそれを行うことができますが、なぜ私は$ this-> getLastPoint(a、b)のような別のfunctoinを介して関数を呼び出せないのですか? – Christoforos

+0

コンストラクタで使用している呼び出し可能コードへの参照があるためです。あなたが使用しているPHPのバージョンは、答えが5と7の間で異なるためです。しかし、基本的に、古いバージョンでは、オブジェクトとメソッドを持つ配列を格納し、call_user_funcを使用します。また、invokeメソッドを使用することもできます。 http://stackoverflow.com/questions/16380745/is-is-possible-to-store-a-reference-to-an-object-method –

+0

私はPHP 7を使用しています。したがって、問題は使用方法を見つけることですコンストラクタの外側で呼び出し可能ですか?私は変数$ getInstancePoint(これはcalable型)をクラスBのインスタンス変数に代入しています。このインスタンス変数は、呼び出し可能な型でも、直接実行されるべきではありませんか? – Christoforos

関連する問題