PHP: How to declare the expected type for an array to pass to an abstract method
PHP arrays may host mixed content. The language processor won't complain if you write this:
$list = [
'some-string',
3,
[ 'key' => 'value' ]
];
That can be useful in many cases but what if you want to declare an abstract method and indicate to developers what it should get?
abstract class MyClass {
public abstract function my_function($args);
}
First approach: make the developer aware of the type #
Adding a comment is enough to tell the developers what your method expect:
abstract class MyClass {
/**
* This method will process a list of objects.
*
* @param MyObjects[] $args
*/
public abstract static function my_function($args);
}
Second approach: make PHP aware of the type #
Declaring the argumens as an array is not enough, as it won't indicate the type of what should be inside the array:
public abstract static function my_function(array $args);
We'll have to transform the array argument into a variable list of MyObject
arguments:
public abstract static function my_function(MyObject ...$args);
On the caller side, the syntax will need to be changed to spread the arrray:
$result = MyClass::my_function(...$array_of_objects);
Final thoughts #
Both approaches can (and should) be mixed: add comments for the developers & make PHP aware of the type.
This implementation makes it easier to follow the types of the variables that are passed across the code but it has a drawback. By declaring a variable list of arguments to a method, you won't be able to pass multiple lists of different types to it.
Let's discuss about this on Mastodon!