2009-04-23 12 views
22

Poiché PHP call_user_method() e call_user_method_array() sono contrassegnati come deprecati, mi chiedo quale alternativa è consigliata?Sostituzioni consigliate per call_user_method obsoleto?

Un modo sarebbe utilizzare call_user_func(), perché assegnando un array con un oggetto e un nome di metodo come primo argomento equivale alle funzioni deprecate. Dal momento che questa funzione non è contrassegnata come deprecata, suppongo che la ragione non sia l'uso non elegante di OOP?

L'altro modo in cui posso pensare è utilizzare lo Reflection API, che potrebbe essere l'alternativa più comoda e orientata al futuro. Tuttavia è più codice e potrei immaginare che è più lento di usare le funzioni di cui sopra.

Quello che mi interessa:

  • C'è una tecnica completamente nuova per chiamare metodi di un oggetto per nome?
  • Qual è la sostituzione più veloce/migliore/ufficiale?
  • Qual è il motivo della deprecazione?

risposta

24

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

La pagina di call_user_method anche lo 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 riguarda il motivo per cui a questa è stata sconsigliata, this posting explains it:

This is because the call_user_method() and call_user_method_array() functions can easily be duplicated by:

old way:
call_user_method($func, $obj, "method", "args", "go", "here");

new way:
call_user_func(array(&$obj, "method"), "method", "args", "go", "here");

Personalmente, probabilmente sarei andare con la variabile suggerimento di variabili pubblicato da Chad.

+0

Nessun problema ... Ero solo curioso;) – okoman

+0

Sembra che l'avviso di la deprecazione nella documentazione PHP su 'call_user_method' dovrebbe puntare a' call_user_func'. Peccato che non sia e devo cercare SO per la risposta ... = D – Aaron

16

Si potrebbe fare usando variable variables, questo mi sembra il più pulito. Invece di:

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

Fate:

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

Il problema con questo è quando non hai idea di quale funzione verrà chiamata e se lo fa o non ha parametro, quanti parametri ha , ecc. Sto usando AMFPHP per comunicare tramite Flex e PHP e sto creando un Gateway Caller che mi impedirà di chiamare PHP più di una volta da Flex per volta. Avrò bisogno di istanza e chiamare più di un metodo e non ho idea se Flex fornirà parametri e se lo fa, sarà in un determinato array. –

1

fare qualcosa di simile: il metodo

io uso qualcosa di simile nella mia __construct().

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

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

primo 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() 

Acclamazioni

0

se si verifica il seguente errore: Avviso: call_user_func() si aspetta che il parametro 1 sia un callback valido, il secondo membro dell'array non è un metodo valido in C: \ www \ file.php on line X e codice come questo:

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

uso (string) dichiarazione per $ nome del metodo

call_user_func(array($this, (string)$method)); 
Problemi correlati