PHP __call
Summary: in this tutorial, you will learn about the PHP __call() magic method and how to use it to wrap existing functions.
Introduction to the PHP __call magic method
The __call() method is invoked automatically when a non-existing method or inaccessible method is called. The following shows the syntax of the __call() method:
public __call ( string $name , array $arguments ) : mixedCode language: PHP (php)
The __call() method accepts two arguments:
$nameis the name of the method that is being called by the object.$argumentsis an array of arguments passed to the method call.
The __call() method is useful when you want to create a wrapper class that wraps the existing API.
PHP __call() magic method example
Suppose that you want to develop the Str class that wraps existing string functions such as strlen(), strtoupp(), strtolower(), etc.
Typically, you can define the method explicitly like length, upper, lower, … But you can use utilize the __call() magic method to make the code shorter.
The following defines the Str class that uses the __call() magic method:
class Str
{
private $s = '';
private $functions = [
'length' => 'strlen',
'upper' => 'strtoupper',
'lower' => 'strtolower'
// map more method to functions
];
public function __construct(string $s)
{
$this->s = $s;
}
public function __call($method, $args)
{
if (!in_array($method, array_keys($this->functions))) {
throw new BadMethodCallException();
}
array_unshift($args, $this->s);
return call_user_func_array($this->functions[$method], $args);
}
}
Code language: HTML, XML (xml)
How it works.
The $functions property store the mapping between the methods and built-in string function. For example, if you call the length() method, the __call() method will call the strlen() function.
When you call a method on an object of the Str class and that method doesn’t exist e.g., length(), PHP will invoke the __call() method.
The __call() method will raise a BadMethodCallException if the method is not supported. Otherwise, it’ll add the string to the argument list before calling the corresponding function.
The following shows how to uses the Str class:
require 'Str.php';
$s = new Str('Hello, World!');
echo $s->upper() . '<br>'; // HELLO, WORLD!
echo $s->lower() . '<br>'; // hello, world!
echo $s->length() . '<br>'; // 13
Code language: HTML, XML (xml)
Output:
HELLO, WORLD!
hello, world!
13
Summary
- The
__call()method is invoked automatically when a nonexisting method or an inaccessible method is called. - Use the
__call()method to wrap existing API into a class.