__call() is triggered when invoking inaccessible methods in an object context.
https://www.php.net/manual/en/language.oop5.overloading.php#object.call
call_user_func_array — Call a callback with an array of parameters
https://www.php.net/manual/en/function.call-user-func-array.php
https://stackoverflow.com/questions/18526060/why-should-one-prefer-call-user-func-array-over-regular-calling-of-function
<?php
function foobar($arg, $arg2) {
echo __FUNCTION__, " got $arg and $arg2\n";
}
class foo {
function bar($arg, $arg2) {
echo __METHOD__, " got $arg and $arg2\n";
}
}
// Call the foobar() function with 2 arguments
call_user_func_array("foobar", array("one", "two"));
// Call the $foo->bar() method with 2 arguments
$foo = new foo;
call_user_func_array(array($foo, "bar"), array("three", "four"));
?>
You have an array with the arguments for your function which is of indeterminate length.
$args = someFuncWhichReturnsTheArgs();
foobar( /* put these $args here, you do not know how many there are */ );
The alternative would be:
switch (count($args)) {
case 1:
foobar($args[0]);
break;
case 2:
foobar($args[0], $args[1]);
break;
...
}// Real example, call model service which is instance of model class, $name is name of function in model class, and $arugments is function arguments in arraycall_user_func_array([$this->modelService, $name], $arguments);------------------Real use of __Call() and call_user_func_array in a class
---------------------------------------
namespace App\Services\ControllerServices;
abstract class BaseControllerService
{
/**
* @var object
*/
protected $modelService;
/**
* @param $name
* @param $arguments
* @return mixed
*/
public function __call($name, $arguments)
{
return call_user_func_array([$this->modelService, $name], $arguments);
}
}
--------------------------------------
namespace App\Services\ControllerServices;
use App\Services\ModelServices\DummyModelService;
class DummyControllerService extends BaseControllerService
{
/*
* Holds product model service
*/
public $modelService;
/**
* Create a new AuthController instance.
* @return void
*/
public function __construct()
{
$this->modelService = new DummyModelService();
}
}
-----------------------------------------
namespace App\Services\ModelServices;
class DummyModelService extends BaseModelService
{
public function saveToDB() {
}
}
--------------------------------------
namespace App\Services\ControllerServices;
use App\Services\ControllerServices\DummyControllerService;
class testerControllerService {
public function test() {
$service = new DummyControllerService();
$servuce->saveToDB();
}
}
No comments:
Post a Comment