Caddy は HTTP/2 に対応した Web サーバーで php-fpm (FastCGI) も利用できる。
go get コマンドでインストールする。
go get github.com/mholt/caddy/caddy
homebrew でもインストールできる。
brew install caddy
Caddyfile を用意する。
localhost:2020
tls self_signed
fastcgi / 127.0.0.1:9000 php
Caddyfile の存在するディレクトリでウェブサーバーを起動させてみよう。
caddy
PHP Internals で str_begin、str_end の提案があったので、mbstring を使って定義してみた。提案のなかではシングルバイトしか考慮されていないが、マルチバイト対応であれば支持をする人が増えるのではないかと思った。
function mb_begin(string $haystack, string $needle, string $enc = null)
{
if ($enc === null) {
$enc = mb_internal_encoding();
}
$len = mb_strlen($needle, $enc);
return mb_substr($haystack, 0, $len, $enc) === $needle;
}
function mb_end(string $haystack, string $needle, string $enc = null)
{
if ($enc === null) {
$enc = mb_internal_encoding();
}
$len = mb_strlen($needle, $enc);
return mb_substr($haystack, $len, null, $enc) === $needle;
}
var_dump(
true === mb_begin('あいうえおかきくけこ', 'あいうえお'),
false === mb_begin('あいうえおかきくけこ', 'かきくけこ'),
true === mb_end('あいうえおかきくけこ', 'かきくけこ'),
false === mb_end('あいうえおかきくけこ', 'あいうえお')
);
文字を文字に変換する mb_convert_encoding の代わりにコードポイントをコードポイントに変換する mb_convert_encoding という
名前の関数を定義してみた。
function mb_convert_codepoint($codepoint, $to, $from = null)
{
if ($from === null) {
$from = mb_internal_encoding();
}
$char = mb_chr($codepoint, $from);
$char = mb_convert_encoding($char, $to, $from);
return mb_ord($char, $to);
}
var_dump(
0x82a0 === mb_convert_codepoint(0x3042, 'Shift_JIS', 'UTF-8')
);
しばらく PHP から離れていたので、リハビリ。
function mb_at($str, $i, $enc = null)
{
if (!$enc) {
$enc = mb_internal_encoding();
}
return mb_substr($str, $i, 1, $enc);
}
function str_gen($str, $enc = null)
{
if (!$enc) {
$enc = mb_internal_encoding();
}
$char = '';
$i = 0;
while ($char = mb_at($str, $i, $enc)) {
++$i;
yield $char;
}
}
$str = 'あいうえお';
foreach (str_gen($str) as $char) {
echo $char, PHP_EOL;
}
IteratorAggregate を実装してイテレーターをつくってみよう。
class StringIterator implements IteratorAggregate {
private $value = '';
private $enc = null;
public function __construct(string $value, $enc = null) {
$this->value = $value;
$this->enc = $enc ? $enc : mb_internal_encoding();
}
public function getIterator() {
$i = 0;
while ($char = mb_at($this->value, $i, $this->enc)) {
yield $char;
++$i;
}
}
}
function mb_at($str, $i, $enc = null)
{
if (!$enc) {
$enc = mb_internal_encoding();
}
return mb_substr($str, $i, 1, $enc);
}
$it = new StringIterator('あいうえお');
foreach ($it as $char) {
echo $char, PHP_EOL;
}
$str = 'ABCDE';
var_dump(
"abcde" === transliterator_transliterate("Any-Lower", $str)
);