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

ottengo questo errore Chiama per metodo non definitoFunzione di chiamata da un oggetto?

+1

probabilmente stai facendo confusione tra lo stile di sintassi javascript e lo stile di sintassi php .... pensa di nuovo a cosa stai cercando –

+0

sì, non gona funziona come in javascript davvero. – mpm

+0

@OMLe chiusure di eternità esistono in PHP (http://www.php.net/manual/en/functions.anonymous.php). La conversione di array in oggetti è possibile. La domanda è valida e solleva un punto interessante in quel modo di fare cose IMO. –

risposta

2

anonimo o no, avete una funzione di callback, quindi è necessario gestire come tale. Es .:

<?php 

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

call_user_func($ar->a); 

?> 
3

Aggiornamento:

Se si utilizza PHP 5.3 o superiore, uno sguardo ad altre risposte si prega :)


Non penso che sia la sintassi corretta, ti darebbe:

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

È necessario creare una classe, aggiungere il metodo ad esso, utilizzare new parola chiave per creare un'istanza di esso e quindi si sarà in grado di fare:

$ar->a(); 

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

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

See Classes and Objects per ulteriori informazioni.

+0

Ma io provo che Ahmed Saber sta cercando di usare una funzione di chiusura invece di dichiarare la classe come si fa. – ANisus

+0

@ANisus: Sembra così, ma anche quello risulterebbe in "Errore fatale: chiamata al metodo non definito stdClass :: a()". @Mukesh ha fornito una risposta qui sotto, vediamo se questo è quello che sta cercando :) – Sarfraz

0

Non esiste alcuna funzione a() ma la proprietà a, quindi è necessario chiamarla per $ar->a.
In ogni caso, non penso che funzionerà nel modo in cui te lo aspetti.

EDIT: Come suggerito da Álvaro G. Vicario si dovrebbe usare call_user_func, non echo chiamare la funzione e funziona correttamente.

0

Oppure, semplicemente per il gusto di farlo, si può fare qualcosa di simile -

<?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

Hai provato questo codice? –

+0

no non ho. È sbagliato? –

+0

'Errore irreversibile: chiamata al metodo non definito stdClass :: a()' nella mia casella 5.3. –

2

Per qualche motivo non sembra forse per eseguire la chiusura il modo di fare. Se si modifica il codice e impostare un'altra variabile alla funzione, può essere chiamato:

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

questa non è una soluzione. Ma da quello che posso vedere, questo sembra un bug o una limitazione in PHP 5.3.

Sto usando 5.3.5 quando provo questo.

+0

Non è '$ a = $ ar-> a;' invece di '$ a = $ ar-> a();'? (si recupera la proprietà, che è una chiusura, e poi la si chiama con '$ a()') –

+0

Oh, certo che lo è. Digitato troppo veloce. Risolto adesso Grazie per segnalarlo. – ANisus

Problemi correlati