LoginSignup
16
3

More than 5 years have passed since last update.

もしも、New PHPの言語設計をするとしたら…。

Last updated at Posted at 2017-08-09

いつもお世話になっている、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になっていたのに…。と思います。

16
3
7

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
3