<?php
$ar = (object) array('a'=>function(){
echo 'TEST';
});
$ar->a();
?>
ottengo questo errore Chiama per metodo non definitoFunzione di chiamata da un oggetto?
<?php
$ar = (object) array('a'=>function(){
echo 'TEST';
});
$ar->a();
?>
ottengo questo errore Chiama per metodo non definitoFunzione di chiamata da un oggetto?
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);
?>
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.
Ma io provo che Ahmed Saber sta cercando di usare una funzione di chiusura invece di dichiarare la classe come si fa. – ANisus
@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
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.
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?"));
?>
Hai provato questo codice? –
no non ho. È sbagliato? –
'Errore irreversibile: chiamata al metodo non definito stdClass :: a()' nella mia casella 5.3. –
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.
Non è '$ a = $ ar-> a;' invece di '$ a = $ ar-> a();'? (si recupera la proprietà, che è una chiusura, e poi la si chiama con '$ a()') –
Oh, certo che lo è. Digitato troppo veloce. Risolto adesso Grazie per segnalarlo. – ANisus
probabilmente stai facendo confusione tra lo stile di sintassi javascript e lo stile di sintassi php .... pensa di nuovo a cosa stai cercando –
sì, non gona funziona come in javascript davvero. – mpm
@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. –