sostituzione consigliata per call_user_method deprecato?
-
13-09-2019 - |
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?
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()
ecall_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));