PHP の○○なところ

今流行りのPHPer になりましたので,一週間くらいでの雑感を書いてみる.
使う前に文句を言うのは違うと思っていたので,
今は言ってもOK.*1

嫌い

  • 行末の";"(セミコロン)が必須(最終文でも省略できない)
  • 5.3 まで名前空間が無い
  • 括弧が省略できない(悪い面とは言えないかもしれない)
  • 一々変数に入れないと駄目(example. array を返す f() で,(f())[0] みたいに書けない)
    • とあいえ,f()->at(0) とかは書けそう.とあいえ array にメソッドを刺せるのか?
  • 5.3 までクロージャが無い
    • string create_function(string, string) があるよ.
    • クロージャではないけど.これでも関数名を意識しないことは達成できるかな.
      • lambda_1 という(名前を意識しない)関数がグローバルに刺さるだけっぽいが.
      • 文字列で関数名として関数を呼んだりとか変数を操作できるらしい(Perl でいうところのハードリファレンスかな)
  • 関数引数の最後にカンマがあるとエラー(?)
  • 最初の行で,shebang を書くとrequire したときにそのまま表示される.これなんとかならんのか?
  • 5.3 まで,mixed array_reduce(array, callback[, int]) の初期値がint
  • boolean array_walk(array, callback [, mixed]) の存在価値がわからない.
  • int array_push(array, mixed) の戻り値が array じゃない
  • 変数宣言的なものが無いので,変数名を間違えるとアウト
    • インスタンス変数だったら,無いよって言ってくれるから少し助かる.
  • == 使うべからず.

好き

  • array が自動的にflatten にならない(Perl 比)
  • var_dump() がある.
  • foreach でイテレータっぽく回せる
    • range() あるし

微妙

  • 名前空間の区切り文字が "\"(バックスラッシュ)
  • 名前空間のネストができない
  • 型チェックが関数の引数にしか無い.(戻り値は?)
  • foreach で => 構文を導入
  • return を明示的に書くのメンドイ
  • array() なのでハッシュっぽいものに順序がある.
    • ksort() という関数(キィでソート)とかいうものもあるくらい

そういえば,一回言われたことで,
型チェックがある関数引数にNULL が入らないという話は,
(stdClass $a = NULL) みたくデフォルト引数が NULL だと
NULL を引数で渡せるとか.よくわかりません.

ということで最近は,lime を使ってお手軽にテストを書いたりしています.
Perl で言うところの Test::Simple みたいなもんすかね.

2010/04/20 21:08 追記
あと,無名であるということはそれを意識しない方向にするための手段である
ということで,無名関数重要.とか.


以下5.3 より前の array_reduce

<?php
function f($r, $i) {
    is_null($r) and $r = array(); // 初期値をここに書く
                                  // 第三引数を省略するとNULL になる
    $r[] = $i;
    return $r;
}
array_reduce(range(1, 5), "f");


以下5.3 より以前の create_function

<?php
array_reduce(range(1, 5), create_function('$r, $i', '
    is_null($r) and $r = array();
    $r[] = $i;
    return $r;
'));

参考

*1:間違えていることはあるかもしれないけど