0

いくつかのことに基づいてデータを生成するクラスがあります。そのデータを外部からフォーマットしたいと思います。そのため、関数をクラスに渡して、そのデータをフォーマットしようとしています。多くの例を見てきましたが、これはユニークなようです。

誰でもこれを行う方法を教えてもらえますか? 次のコードはエラーになります。

<?php
class someClass { 
    var $outsideFunc; // placeholder for function to be defined from outside
    var $somevar='Me'; // generated text 
    function echoarg($abc){ 
        $outsideFunc=$this->outsideFunc; // bring the outside function in
        call_user_func($outsideFunc,$abc); // execute outside function on text
        echo $abc;
    }

}

function outsidefunc($param){ // define custom function
    $param='I am '.$param;
}

$someClass=new someClass();
$someClass -> outsideFunc = 'outsideFunc'; // send custom function into Class
$someClass -> echoarg($someClass->somevar);
4

4 に答える 4

1

関数を引数として渡してみませんか?

<?php
class someClass {
  public $somevar="Me";
  public function echoarg($abc,$cb=null) {
    if( $cb) $cb($abc);
    echo $abc;
  }
}

$someClass = new someClass();
$someClass->echoarg($someClass->somevar,function(&$a) {$a = "I am ".$a;});
于 2012-12-30T07:28:21.143 に答える
1
$someClass -> outsidefunc = 'outsidefunc';

PHP では、関数名は大文字と小文字を区別しませんが、オブジェクト プロパティ名は大文字と小文字を区別します。$someClass->outsideFuncではなく、が必要です$someClass->outsidefunc

適切な OOP 設計の実践では、外部コードからプロパティに直接アクセスするだけでなく、getter メソッドと setter メソッドを使用する必要があることに注意してください。また、PHP 5.3 で無名関数のサポートが導入されたことにも注意してください。


うん。あなたが正しいです。これでエラーはなくなりました。しかし、それも機能しません。

デフォルトでは、PHP は引数を参照渡ししません。outsidefunc() は、実際には何も役に立ちません。呼び出し元で $param を別のものに設定し、新しい値を返すだけにしたくない場合は、関数のシグネチャを次のように変更できます。

function outsidefunc(&$param) {

call_user_func() では引数を参照渡しできないため、関数の呼び出し方法も変更する必要があります。これらの方法のいずれかが機能するはずです。

$outsideFunc($abc);
call_user_func_array($outsideFunc, array(&$abc));
于 2012-12-30T07:31:55.857 に答える
0

あなたが何を探しているのか正確にはわかりませんが、私が得たのは、 PHPのタイプヒンティングによって達成できる関数にオブジェクトを渡したいということです。

class MyClass {
    public $var = 'Hello World';
}

function myFunction(MyClass $foo) {
    echo $foo->var;
}
$myclass = new MyClass;
myFunction($myclass);
于 2012-12-30T07:29:53.687 に答える
0

OP、おそらくクロージャーはあなたが探しているものですか?探していることを正確に実行するわけではありませんが (実際にはクラスに関数を追加します)、クラス変数に追加して、通常の無名関数のように実行できます。

$myClass->addFunc(function($arg) { return 'test: ' . $arg });
$myClass->execFunc(0);

class myClass {
    protected $funcs;
    public function addFunc(closure $func) {
        $this->funcs[] = $func;
    }

    public function execFunc($index) { $this->funcs[$index](); } // obviously, do some checking here first.
}
于 2012-12-30T07:38:25.833 に答える