それはどうだろ

register_globalsなどなど

あともうPHPは本家の人達がだめすぎますね。register_globalsとmagic_quotes_gpc使えなくしたらほとんどのPHPプログラムが動かなくなりますよね。絶対PHPの人気なくなるとおもうんですが。

いまどきsf.netに転がってるのもでも大分register_globals = onじゃないとだめなOSSは少なくなってきてるぞ.

大体php.iniで

auto_prepend_file=foo.php

してこんなコード仕込めば万事解決!!

<?php
//  foo.php
array_walk_recursive( $_REQUEST, "addslashes");
extract( $_REQUEST);
//  一応
$HTTP_GET_VARS = $_GET;
$HTTP_POST_VARS = $_POST;
//  ほかにもごちゃごちゃ
?>

ちゃんとした言語に向かうPHP?

過去の資産使えなくして何がうれしいんですかね。まさか「ちゃんとした言語」でも目指してるんでしょうか。strtotimeの戻り値の変更の時も思ったんですが「おまえら後方互換なくしてまで修正する事ならもっと優先度の高いのがあるだろ」と。

とりあえず標準関数は全部「<MODULE-NAME>_foo()」とかにしろ!!
マニュアル探すのもめんどくさいんだYO!!

これからのPHPを邪推

で,話変わるんだか変わらないんだかですけど,2月のいつぞや(多分 に行われた超極めるPHPの座談会でも話したのですが

「おぶじぇくとしこう」を目指すならJavaをはじめ,既に枯れた(あるいは未来にはより枯れた)実装があるから要らない.
PHPは「かんたんべんり」だから使われはじめていたんです.そして特徴として伝えられてきた.
しかしその特徴は既に全部obsoleteなんですよ.使うななんですよ.

  • フォームから渡された値は「$foo」ですぐ扱えるから便利なんだよ=>register_globals = Offがデフォルトで消えた
  • HTML中にプログラムが書けるので簡単に動的ページが作れるから便利なんだよ=>いまどきふつーテンプレート使うでしょ
  • 型宣言ないの便利だよね.型の自動変換とか=>特に初心者は勝手に型変換されて困ること多数,typoやvalidate不足で未使用変数の参照で挙動不審や脆弱性につながる
  • 面倒なエスケープとか文字エンコードの変換とかPHPなら自動でかってにやってくれるYO!!=>自動処理系はmbstringの自動文字エンコード変換はトラぶったときに対処ができず,magic_quoteはoffが常識
  • 沢山便利な関数があって簡単にプログラムが組めちゃう=>いまどき基本的な関数群ならともかく例えばデータベースなどは抽象化レイヤークラスを使うのがあたりまえ

こういう文化は今後どんどん強まるでしょう.
じゃあPHP使う意味は? それはあると思います.例えば私はPHPバッドノウハウも含め,既にある程度把握してるのである程度のレベルのものでもサクサク実装できるとか.
でも新規に覚える理由は徐々になくなるんですよ.今の,それからおそらくこれから出てくるであろうPHPの特徴は他言語多言語でも成り立ちますから.
しいていうと一昔前に「動的ページはperlで実装が有利,理由はperlはどこにでもインストールされているから」というのが「動的ページはPHPで実装が有利,理由はPHPはどこにでもインストールされているから」という以外の理由あまりないですよね.識者が多いとか? ホントに多いのかな.質より量ですかってところでなら多いかもしれません(ゲラ

個人的にはPHPのポジションはJavaScriptJavaScriptがサーバーサイドで動けばいいんです.
データベースなどなどサーバーサイドで扱う必要があるリソースへのアクセスメソッドがあれば.
いちいちクライアントとサーバーで違う言語を使うなんてナンセンスです.
もうPHPが今開発元が目指すPHPになっていったなら,未来にはPHPは要らないんですよ.

さて座談会はどういう風に載ってるのか楽しみ.

gotoネタ余談

gotoが嫌われていますが,mbstringでgotoが使われています.
もう使うの辞めようZE!!

http://cvs.php.net/viewcvs.cgi/%2Acheckout%2A/php-src/ext/mbstring/libmbfl/filters/mbfilter_jis.c?content-type=text%2Fplain

static int mbfl_filt_ident_jis(int c, mbfl_identify_filter *filter)
{
retry:
	switch (filter->status & 0xf) {
(snip)