<?php
class Str {
/** PHPの組み込み関数の第一引数に使う値をプロパティとしてセット */
public function __construct(
public string $str
){}
/**
* このクラスで外部に公開していない名前のメソッドが呼ばれた場合に動作するマジックメソッド
* @see https://www.php.net/manual/ja/language.oop5.overloading.php#object.call
*/
public function __call($name, $arguments)
{
// 呼ばれたメソッド名の関数を第一引数を最初に与えたプロパティ、
// 第二引数以降を呼ばれた際の引数として実行
$result = $name($this->str, ...$arguments);
// 関数の返り値が文字列ならば返り値を元に自身のインスタンスを生成して返却
// 関数の返り値が文字列でないならば返り値をそのまま返却
return is_string($result) ? new self($result) : $result;
}
/** __call に処理を渡さず、第二引数にプロパティの値を渡して explode 関数を実行するメソッドを用意する */
public function explode(string $separator, ?int $limit = PHP_INT_MAX)
{
return explode($separator, $this->str, $limit);
}
}
$s = new Str('hoge');
$res = $s->substr(0, 2)
->strtoupper()
->str_pad(4, '0', STR_PAD_LEFT)
->explode('H');
var_dump($res);
/*
array(2) {
[0]=>
string(2) "00"
[1]=>
string(1) "O"
}
*/
- Output for 8.0.1 - 8.0.30, 8.1.0 - 8.1.31, 8.2.0 - 8.2.26, 8.3.0 - 8.3.15, 8.4.1 - 8.4.2
- array(2) {
[0]=>
string(2) "00"
[1]=>
string(1) "O"
}
- Output for 7.4.0 - 7.4.33
- Parse error: syntax error, unexpected 'public' (T_PUBLIC), expecting variable (T_VARIABLE) in /in/17rYQ on line 5
Process exited with code 255.
preferences:
84.65 ms | 406 KiB | 5 Q