php7.0以前までは、
$str[3]
のように、 角括弧を使用してゼロから始まるオフセットを指定すると、
文字列内の任意の文字を取り出すことが可能でした。
ただ、php7.1からは負の値のオフセットも指定できるようになりました。
注意: PHP 7.1.0 以降では、負の文字列オフセットにも対応するようになりました。 これは、文字列の末尾からのオフセットを表します。 以前のバージョンでは、負のオフセットで読み込もうとすると E_NOTICE が発生し (空文字列を返します)、負のオフセットで書き込もうとすると E_WARNING が発生していました (文字列には何も手が加えられません)。
var_dump("abcdef"[-1]);
var_dump("abcdef"[2]);
var_dump("abcdef"[-3]);
出力結果
ーーーーー
string(1) "f"
string(1) "c"
string(1) "d"
単一文字の場合はsubstr()を使う必要がなくなりそうです。
複数の文字を取り出したり変更したりしたいときは、substr()を使用すればよいです。
ただ、個人的には第三者への可読性という意味ではsubstr()を使ってもいいのかと思います。