class ArrayEx {
private $array;
// 存在しないインスタンスメソッドが呼ばれた時の処理
public function __call($name, $arguments)
{
$class = get_class();
if (!method_exists($class, "_{$name}")) trigger_error("Call to undefined method {$class}::{$name}()", E_USER_ERROR);
return call_user_func_array([$class, "_{$name}"], [$this->array, ...$arguments]);
}
// 存在しない静的メソッドが呼ばれた時の処理
public static function __callStatic($name, $arguments)
{
$class = get_class();
if (!method_exists($class, "_{$name}")) trigger_error("Call to undefined method {$class}::{$name}()", E_USER_ERROR);
return call_user_func_array([$class, "_{$name}"], $arguments);
}
public function __construct($array) {
$this->array = $array;
}
// 静的メソッドとしてもインスタンスメソッドとしても呼び出せるメソッドの定義
protected function _first($array, $default = null) {
return count($array) > 0 ? $array[0] : $default;
}
}
$array = [1, 2, 3];
$first = ArrayEx::first($array); // 1
$first = (new ArrayEx([4, 5, 6]))->first(); // 4