Volanie užívateľských funkcií

Na volanie funkcie z internej funkcie by ste mali použir funkciu call_user_function().

call_user_function() vracia SUCCESS pri úspechu a FAILURE v prípade, že sa funkcia nedá nájsť. Mali by ste si tú vrátenú hodnotu overiť! Ak vráti SUCCESS, ste zodpovedný za zničenie retval pval sami (alebo ju vráti ako vrátenú hodnotu funkcie). Ak vráti FAILURE, nie je hodnota retval definovaná a nesmiete sa jej dotknúť.

Všetky interné funkcie, ktoré volajú užívateľské funkcie musia byť znovu zavedené. Medzi iným to znamená, že nesmú používať globálne ani statické premenné.

call_user_function() má šesť argumentov:

HashTable *function_table

Toto je hash tabuľka, v ktorej sa funkcia má hľadať.

pval *object

Toto je ukazovateľ na objekt, na ktorý by sa mala funkcia vyvolať. Mal by byť NULL ak sa volá globálna funkcia. Ak nie je NULL (t.j. ukazuje na objekt), argument function_table sa ignoruje, a namiesto toho sa berie z hashu objektu. Objekt sa *môže* modifikovať funkciou, ktorá je naň vyvolaná (tá funkcia bude mať k nemu prístup cez $this). Ak pre nejaký dôvod nechcete, aby sa tak stalo, namiesto toho pošlite kópiu objektu.

pval *function_name

Názov funkcie, ktorá sa má volať. pval musí byť typu IS_STRING s function_name.str.val a function_name.str.len nastavenými na príslušné hodnoty. function_name je modifikovaná call_user_function() - je prekonvertovaná na lowercase. Ak chcete prípad zachovať, namiesto toho pošlite kópiu názvu funkcie.

pval *retval

Ukazovateľ na štruktúru pval, do ktorej sa vrátená hodnota vyvolanej funkcie uloží. Štruktúra musí byť predtým vyhradená - call_user_function() ju sama NEVYHRADÍ.

int param_count

Počet parametrov predávaných funkcii.

pval *params[]

Pole ukazovateľov na hodnoty, ktoré sa predávajú ako argumenty funkcií, prvý argument je v offsete 0, druhý v offsete 1, atď. Pole je pole ukazovateľov na pval; Ukazovatele sa pošlú ako keby funkcii, čo znamená, že ak funkcia modifikuje svoje argumenty, pôvodné hodnoty sa zmenia (predávanie odkazmi). Ak nechcete také správanie, namiesto toho predajte kópiu.