Domanda

A partire da PHP di call_user_method() e call_user_method_array() sono contrassegnati deprecato mi chiedo quale alternativa è consigliato?

Un modo potrebbe essere quello di utilizzare call_user_func() , perché dando una array con un oggetto e un nome di metodo come primo argomento fa lo stesso come le funzioni deprecate. Poiché questa funzione non è contrassegnato deprecato Suppongo che la ragione non è l'uso non-OOP-elegante di loro?

L'altro modo posso pensare utilizza il API Reflection , che potrebbe essere il più comodo e orientata al futuro alternativo. Tuttavia è più codice e ho potuto immagine che è più lento di quello di utilizzare le funzioni di cui sopra.

Quello che mi interessa:

  • C'è una tecnica completamente nuova per chiamare metodi di un oggetto per nome?
  • Quale è il / migliore / sostituzione ufficiale più veloce?
  • Qual è il motivo di disapprovazione?
È stato utile?

Soluzione

Come hai detto call_user_func può facilmente riprodurre il comportamento di questa funzione. Qual è il problema?

La pagina call_user_method anche elenca come l'alternativa:

<?php
call_user_func(array($obj, $method_name), $parameter /* , ... */);
call_user_func(array(&$obj, $method_name), $parameter /* , ... */); // PHP 4
?>

Per quanto a perché questo è stata sconsigliata, questo annuncio lo spiega:

  

Questa è   poiché le funzioni call_user_method() e call_user_method_array()   può essere facilmente ripetuto da:

     

vecchia maniera:
  call_user_method($func, $obj, "method", "args", "go", "here");

     

modo nuovo:
  call_user_func(array(&$obj, "method"), "method", "args", "go", "here");

Personalmente, probabilmente sarei andare con il suggerimento variabili variabile inviato da Chad.

Altri suggerimenti

Si potrebbe farlo utilizzando variabili variabili , questo sembra il più pulito per me. Invece di:

call_user_func(array($obj, $method_name), $parameter);

Lo fai:

$obj->{$method_name}($parameter);

fare qualcosa di simile:

Io uso una cosa del genere nel mio metodo __construct ().

$params = array('a','b','c'); // PUT YOUR PARAMS IN $params DYNAMICALLY

call_user_func_array(array($this, $this->_request), array($params));

1 ° argomento: esempio obect, 2 ° argomento: metodo da chiamare, 3 ° argomento: params

Prima di poter verificare se il metodo o Classe anche, con:

method_exists()
class_exists()

Saluti

se si ottiene errore seguente: Attenzione: call_user_func () si aspetta parametro 1 per essere un callback valida, secondo elemento di matrice non è un metodo valido in C: \ www \ file.php sulla linea X e il codice in questo modo:

call_user_func(array($this, $method));

uso (stringa) dichiarazione per $ nome del metodo

call_user_func(array($this, (string)$method));
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top