2013-08-26 4 views
1

Я пытаюсь динамически получить метод класса, но PHP генерирует исключение, которое говорит Неопределенное свойство: 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-> студент-> gifts-> totalPoint() как раз передать студенту-> подарки-> totalPoint() ко мне thod для параметра $ name

Вы можете мне сказать, в чем моя ошибка?

+0

Похоже, вы пытаетесь обрабатывать выражения языка, такие как строки во время выполнения. Это невозможно, что-то вроде '$ row-> student-> gifts-> totalPoint()' является _not_ строкой, которую вы можете манипулировать со строковыми функциями. По крайней мере, не в нормальных условиях. – arkascha

+0

нет Работает правильно, но имеет проблемы с функциями !, что необычные условия? –

+1

Ваша последняя часть выражения попытается получить доступ к свойству с именем 'totalPoint()', это будет * not * вызывать метод totalPoint. Для динамического вызова используйте '$ tempRow -> {$ value}()' while '$ value' в этом случае должен быть' totalPoint', без брекетов. –

ответ

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(), который вам также может понадобиться.

+0

как насчет моего решения ??? http://snippets.code-nevis.ir/44 –

+0

Я точно знаю, какой объект предназначен для прохождения! но можете ли вы рассказать мне о возможностях отражения php? –

+0

Я думаю, что ваше решение будет работать до тех пор, пока ваша строка ввода будет правильно сформирована. Это сломалось бы, например, если было передано что-то вроде 'foo-> b() ar'. Но, учитывая, что в этой функции нет другой проверки ввода, которая, вероятно, является одной из наименьших из ваших проблем. Подробнее об отражении Google 'PHP Reflection' или о том, как читать PHP-документы здесь: http://php.net/manual/en/book.reflection.php –

Смежные вопросы