いつもお世話になっている、PHP。
バージョンも7.2まで上がってきて、次は8と言われています。
しかし、長く進化し続けてきたということは、過去の負債も背負っているのは宿命というもの。
そんな過去の負債を断ち切るために、自分が新しくNew PHPの言語設計をするとしたら…というのを考えてみました。
お断り: 以下は個人の見解であって、所属先の見解ではありません。
シンボル名をcase-sensitiveに
とにかく今すぐなんとかしてほしいのがこれ。
PHPは予約語、関数名、クラス名、メソッド名がcase-insensitiveなので、大文字と小文字の区別がありません。
だからこんな奇妙なコードもしっかり動作しちゃいます。
$a = true;
iF($a == tRUe){
EcHo 'true';
}
これが更に問題となるのは、名前空間と組み合わせたときにクラス名が予約語に衝突しちゃうことがあることです。
namespace Foo;
class Int { // PHP Fatal error: Cannot use 'Int' as class name as it is reserved
}
クラス名がcase-sensitiveでさえあれば、こういう問題は起こらなかったんです。
PHP 7の間はE_DEPRECATED
にしておいて、PHP 8からcase-sensitiveにしてくれないものだろうか…。
primitive廃止
primitive(int, string, array, boolなど)は組み込みクラスに変更。
そうすれば、
$a = ['a', 'b', 'c'].map(function($x) { return $x.toupeer(); });
みたいな書き方ができるし、str_xxx()
、array_xxx()
みたいな関数が一掃できます。
自動変換廃止
primitiveを廃止すれば自動的に解決されると思うけど、これがあるおかげで===
演算子を道入せざるを得なくなってしまったわけで、型の自動変換は存在自体が悪です。
1 == '1' // true
1 === '1' // false
型変換が必要な場合は明示的に行わせましょう。そのためにIntegerable
みたいなinterfaceを用意しても良いと思います。
エラーを例外オブジェクトに統一
もう、E_XXXX
はお役御免にして、例外オブジェクトに統一してほしい。
assert
は例外オブジェクト化されたのに、中途半端すぎ。
あとPHP7で導入された Throwable
は微妙に問題が多いので、素直にException
を頂点に戻してほしい。
7の間は、php.ini
で例外にするか、E_XXXX
にするかを選べるようにして、8から例外に移行すればよかったと思います。
正規表現クラス導入
PHPでの正規表現はただの文字列なので、エスケープが大変なんです。
いい加減
/^abc$/.match('abc');
とか書きたいです。
preg_match('/^abc$/', 'abc');
だと読みづらいし、スクリプトの実行(コンパイル)毎に正規表現のコンパイルが発生してしまいます。リテラル化してればOPCache(APC)のキャッシュ対象にすることも可能でしょう。
組み込みテンプレートエンジンを廃止
もう、ファイルの先頭に
<?php
と書くのは疲れました。
つい、うっかり
<?php // 先頭に空白
と書いちゃって、不要な空白が出力されて header()
がエラーになったりするのは面倒なんです。
テンプレートエンジンは専用のライブラリでやってください。
メソッド名のオーバーロード
C++でおなじみの、引数の数や型が違えば同じメソッド名が定義できるやつです。
class Foo
{
public funciton search(Bar $bar) // Barで検索
{
}
public funciton search(Baz $baz) // Bazで検索
{
}
}
同じようなことをやるメソッドで引数の数の型が違う場合に、別のメッソド名を考えるのは無駄だし面倒なんです。
ByXXX
とかForXXX
みたいなsuffixを付けるのは嫌です。
後置if構文のサポート
perlとかrubyでサポートされている
if($condition){
foo();
}
を
foo() if($condition);
と書ける構文のことです。
これが導入されると、複数のガード節をスッキリ書けます。
function(){
return if(なんとか); // ガード節1
return if(かんとか); // ガード節2
}
クラスのメソッドはデフォルトで $this
を返すようにする
PHPの組み込みクラスには、特に返す値も無いのに $this
を返さないメソッドが多くて、メソッドチェーンできずにイライラします。
特にXML関連、ImageMagicとかがひどいです。
メソッドのデフォルトが$this
を返す仕様だったら、これらのメソッドが自動的にMethod Chainableになっていたのに…。と思います。