php call class function by string name

The name of the pictureThe name of the pictureThe name of the pictureClash Royale CLAN TAG#URR8PPP



php call class function by string name



How can I call a normal (not static) class function by its name?



The below gives an error saying param 1 needs to be a valid callback. I don't want the function to be static, I want it to be a normal function, and all the examples I've seen so far had them static.


class Player

public function SayHi() print("Hi");


$player = new Player();

call_user_func($Player, 'SayHi');





read example 4 on their documentation: php.net/manual/en/function.call-user-func.php
– Matthew
May 24 '13 at 17:02





I wonder that it is not complaining about the case. You are declaring "player" but calling "Player", with a capital "P".
– Drazen Mokic
May 24 '13 at 17:05





@drale2k: It is complaining. "param 1 needs to be a valid callback"
– Rocket Hazmat
May 24 '13 at 17:07






sorry, just a typo on this site on the P vs p. @Rocket, I understand that but was wondering how I would fix it in php syntax like the answers below provided me.
– user441521
May 24 '13 at 17:22




5 Answers
5



The callback syntax is a little odd in PHP. What you need to do is make an array. The 1st element is the object, and the 2nd is the method.


callback


call_user_func(array($player, 'SayHi'));



You can also do it without call_user_func:


call_user_func


$player->'SayHi'();



Or:


$method = 'SayHi';
$player->$method();





Awesome thanks!
– Steve Bauman
May 9 '14 at 19:15





Please is the third example identified with a particular name?
– Marco Dufal
Apr 16 at 3:47





What is the second method called?
– Zack
May 8 at 14:11



You need to pass the object and method together as an array:


call_user_func(array($Player, 'SayHi'));



See callbacks, specifically:


// Type 3: Object method call
$obj = new MyClass();
call_user_func(array($obj, 'myCallbackMethod'));



You are anyway creating an object of the class, so you can use object to call its function.


$player = new Player();
$player->SayHi();



or use callback


$player = new Player();
call_user_func(array($player, 'SayHi'));





That was just an example. I need to store the objects and their functions as callbacks, that will be fired from another system, but I didn't want to type that code out.
– user441521
May 24 '13 at 17:05






see my edited answer
– Nagarjun
May 24 '13 at 17:06



I am giving my answer to a different question here ( PHP - Can you assign a member function to a variable? ), because it was marked as duplicate by some stackoverflow radicals, and I cannot give my answer to his question! The mentality of stackoverflow fanatics needs to stop.



btw generally this is anti pattern:


$a = 'Pl';
$b = 'aye';
$c = 'r';

$z = $a . $b . $c;

$myz = new $z();


$d = 'Say';
$e = 'Hi';

$x = $d.$e;
$myz->$x()



now spread out all variables across your code. You have become the anti christ.



why? because nobody can read your code any longer. Including yourself.



Better is to have the actual references in your code to the function calls you make. Not hidden in some obscure strings. No, just standard calls to the code, wrapped into a function.



Try to keep it as simple as possible. So a better solution would be this:


$x = function()
$player = new Player();
$player->sayHi();
;


$x();



your IDE will find those references. $myz->$x() your IDE will not find and you wont be able to maintain well your code


$myz->$x()



$player->SayHi();


$player->SayHi();



I prefer this form.





And yet this doesn't remotely answer the question. -1
– Matt Ball
May 24 '13 at 17:03





The point is that 'SayHi' is a string.
– Rocket Hazmat
May 24 '13 at 17:04


'SayHi'





You meant $player->$SayHi()?
– greenoldman
Jun 18 '16 at 20:55


$player->$SayHi()






By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Popular posts from this blog

Firebase Auth - with Email and Password - Check user already registered

Dynamically update html content plain JS

How to determine optimal route across keyboard