2012-04-10 5 views
5
<?php 
$ar = (object) array('a'=>function(){ 
    echo 'TEST'; 
}); 
$ar->a(); 
?> 

Я получаю эту ошибку Призыв к неопределенному методуВызов функции от объекта?

+1

Возможно, вы испортили это между стилем синтаксиса javascript и стилем синтаксиса php .... снова подумайте, что вы ищете –

+0

Да, это не работает, как в javascript. – mpm

+0

@OM. Закрытие полномочий существует в PHP (http://www.php.net/manual/en/functions.anonymous.php). Возможно преобразование массивов в объекты. Вопрос верен и вызывает интересный момент в том, как делать вещи ИМО. –

ответ

2

Анонимно или нет, у вас есть функция обратного вызова, таким образом, вы должны обрабатывать его как таковой. Например:

<?php 

$ar = (object) array(
    'a' => function(){ 
     echo 'TEST'; 
    } 
); 

call_user_func($ar->a); 

?> 
3

Update:

Если вы используете PHP 5.3 или выше, посмотрите на другие ответы, пожалуйста :)


Я не думаю, что это правильный синтаксис, это даст вам:

Parse error: syntax error, unexpected T_FUNCTION in.... 

Вам нужно создать класс, добавить метод к нему, используйте new ключевое слово, чтобы создать его экземпляр, и тогда вы сможете сделать:

$ar->a(); 

class myclass 
{ 
    public function a() 
    { 
     echo 'TEST'; 
    } 
} 

$ar = new myclass; 
$ar->a(); // TEST 

См Classes and Objects для получения дополнительной информации.

+0

Но я пытаюсь Ahmed Saber пытается использовать функцию закрытия вместо объявления класса так, как вы это делаете. – ANisus

+0

@ANisus: Это выглядит так, но даже это приведет к «Неустранимая ошибка: вызов неопределенного метода stdClass :: a()». @Mukesh предоставил ответ ниже, давайте посмотрим, является ли это то, что он ищет :) – Sarfraz

0

Нет функции a(), но в собственности a, поэтому вы должны называть ее $ar->a.
В любом случае, я не думаю, что это будет работать так, как вы ожидаете.

EDIT: По предложению Г. Альваро Викарио вы должны использовать call_user_func, не echo для вызова функции, и он будет работать правильно.

0

Или просто для удовольствия, вы можете сделать что-то вроде этого -

<?php 
$ar = new stdClass; 
$ar->a = function($to_echo){ echo $to_echo; }; 
$temp = $ar->a; 

//[Edit] - $ar->a("hello"); // doesn't work! php tries to match an instance method called  "func" that is not defined in the original class' signature 
$temp("Hey there"); 
call_user_func($ar->a("You still there?")); 
?> 
+0

Вы действительно пробовали этот код? –

+0

нет у меня нет. Это неправильно? –

+0

'Неустранимая ошибка: вызов неопределенного метода stdClass :: a()' в моем поле 5.3. –

2

По какой-то причине, похоже, что это не так, как вы делаете. Если изменить код и установить другую переменную в функцию, ее можно назвать:

$ar = (object) array('a'=>function(){ 
    echo 'TEST'; 
}); 
$a = $ar->a; 
$a(); 

Это не решение. Но из того, что я вижу, это похоже на ошибку или ограничение в PHP 5.3.

Я использую 5.3.5 при попытке этого.

+0

Разве это не '$ a = $ ar-> a;' вместо '$ a = $ ar-> a();'? (вы получаете свойство, которое является закрытием, а затем вызываете его с помощью '$ a()') –

+0

О, конечно, это так. Набирается слишком быстро. Исправлено. Спасибо, что указали это. – ANisus