1

クラスのメソッドを動的に取得しようとしましたが、php は Undefined property: stdClass ... という例外をスローします。

値を取得する方法

private function getExactValue($row, $name)
{
    $tempRow = clone $row;
    foreach( explode('->', $name) as $key => $value)
    {
        $temp = $tempRow->{$value};
        unset($tempRow);
        $tempRow = $temp;
    }
    return $tempRow;
}

$row はオブジェクトのインスタンスです (標準のものではありません)

$name は、トラバースするオブジェクトで必要なものです。たとえば、$row->student->gifts->totalPoint() が必要な場合は、student->gifts->totalPoint() を $name パラメータのメソッドに渡すだけです。

私の間違いが何であるか教えてもらえますか?

4

1 に答える 1

2

ここで何をしようとしているのかがわかります。私の最初のアドバイスは、あなたが達成しようとしていることを非常にハックな方法で行っているということです。未知のオブジェクトに対して任意のメソッドを実行できるようにするためのより良い方法が必要な場合は、PHP のリフレクション機能を調べることをお勧めします。

そうは言っても、コードの問題は、メソッドの名前を利用する必要がある文字列を介してメソッドを実行しようとしているように見えます。私が提案するのは、文字列を展開するループ内で、->それがメソッドであるかどうかを検出し、それに応じて行動することです。それは次のようになります。

foreach( explode('->', $name) as $value)
{
    $value_trimmed = rtrim($value, '()');
    if ($value === $value_trimmed) {
        // this is a property
        $tempRow = $tempRow->{$value};
    } else {
        // this is a method
        $tempRow = $tempRow->{$value_trimmed}();
    } 
}

また、各セグメントに有効なプロパティ/メソッド名があることを確認するために、おそらく入力に対してもいくつかの検証を行う必要があります。また、文字列全体が実際に適切に形成されていること (つまり、 のようなものがないことfoo->->bar(())) の検証を追加する必要があります。もちろん、これは、foo[0]->bar()対応する必要があるような配列を処理する方法については言及していません。

于 2013-08-26T19:57:29.397 に答える