リンクした質問が削除されたので、その一部をここに置きます。
質問
私は、別の質問スレッドで、PHP をひどい言語と呼ぶ皮肉なコメントをしたところ、狂ったように反対票を投じられました。ここには、PHPが好きな人がたくさんいるようです。
だから私は本当に興味があります。私は何が欠けていますか?PHP が優れた言語である理由は何ですか?
嫌いな理由は以下です。
PHP では、組み込み関数とライブラリ関数の命名に一貫性がありません。予測可能な命名パターンは、どの設計においても重要です。
PHP には、組み込み関数のパラメーターの順序付けに一貫性がありません。たとえば、array_map と array_filter などです。これは、単純なケースでは煩わしく、あらゆる種類の予期しない動作やさらに悪い結果を引き起こします。
PHP 開発者は、組み込み関数と下位レベルの機能を常に非推奨にしています。良い例は、関数の参照渡しを廃止したときです。これは、たとえば関数のコールバックを行うすべての人にとって悪夢のようなものでした。
再設計の考慮不足。上記の非推奨により、多くの場合、関数にデフォルトのキーワード値を提供する機能がなくなりました。彼らはこれを PHP 5 で修正しましたが、PHP 4 では参照渡しを非推奨にしました!
名前空間の実行が不十分です (以前は名前空間がまったくありませんでした)。名前空間が存在するので、逆参照文字として何を使用しますか? バックスラッシュ!PHP でさえ、エスケープのために普遍的に使用される文字です!
暗黙的な型変換が広すぎると、バグが発生します。たとえば、浮動小数点数から整数への暗黙的な変換、またはその逆の暗黙的な変換に問題はありません。しかし、PHP (私が最後にチェックしたもの) は喜んで配列を魔法のように整数に変換しようとします。
再帰のパフォーマンスが悪い。再帰は、あらゆる言語で書くための根本的に重要なツールです。複雑なアルゴリズムをはるかに単純にすることができます。貧弱なサポートは許されません。
関数は大文字と小文字を区別しません。彼らがこれについて何を考えていたのか、私にはわかりません。プログラミング言語は、コンピューターとコードのリーダーの両方に対してあいまいさなしに動作を指定する方法です。大文字と小文字を区別しないと、多くのあいまいさが生じます。
PHP は、処理とプレゼンテーションの結合を推奨しています (実際には必要です)。はい、そうしない PHP を作成することはできますが、実際には (適切な設計の観点から) 間違った方法でコードを作成する方が簡単です。
PHP のパフォーマンスは、キャッシュなしでは最悪です。PHP 用の商用キャッシング製品を販売している人はいますか? ああ、ほら、PHPの設計者はそうしています。
最悪なことに、PHP は Web アプリケーションの設計は簡単だと人々に信じ込ませてしまいます。そして、それは確かに、関連する多くの労力をはるかに簡単にします. しかし実際には、安全で効率的な Web アプリケーションを設計することは非常に難しい作業です。
多くの人にプログラミングを始めるよう説得することで、PHP はプログラマーのサブグループ全体に悪い習慣と悪い設計を教えました。安全に使用するための理解が不足している機能へのアクセスが与えられます。これは、PHP が安全ではないという評判につながっています。
(ただし、PHP が他の Web プログラミング言語と比べて多かれ少なかれ安全であることは認めます。)
PHP について欠けているものは何ですか? 有機的に成長し、管理が不十分な言語の混乱が、貧弱なプログラマーを生み出しているのを見ています。
そうでなければ私を説得してください!
評価の高い回答
私はあなたの箇条書きのそれぞれに対応することに挑戦します
PHP では、組み込み関数とライブラリ関数の命名に一貫性がありません。予測可能な命名パターンは、どの設計においても重要です。
私はこのトピックが好きでもあり、嫌いでもあります。本質的に、この問題は正しいからです。一部のバイワード関数がアンダースコアで分割され、一部が分割されないのはなぜですか? 針と干し草の山パラメータが引数シグネチャの位置を時々交換するのはなぜですか? バカバカしい。しかし、結局のところ...これは本当に重要ですか?Intellisense と php.net を備えた私の IDE は、ブラウザをクリックするだけで、それほど大したことではありません。言語としてのPHPに対してマイナスですか?はい。有能なプログラマーになる能力を妨げますか? いいえ。
PHP 開発者は、組み込み関数と下位レベルの機能を常に非推奨にしています。良い例は、関数の参照渡しを廃止したときです。これは、たとえば関数のコールバックを行うすべての人にとって悪夢のようなものでした。
個人的には、これは良い点ではないと思います。言語の進化には非推奨化が必要です。特に、PHP のように多くの欠陥がある言語ではそうです。PHP は「下手なプログラマーになりやすい*」ことで多くの批判を受けていますが、同時に PHP グループは、コールタイム パスバイなどの愚かな構造を言語から取り除こうとしても問題を抱えています。 -参照。呼び出し時の参照渡しをなくすことは、彼らが行った最高の取り組みの 1 つです。初心者の開発者にとって、この「機能」ほど簡単に失敗する方法はありませんでした。
再設計の考慮不足。上記の非推奨により、多くの場合、関数にデフォルトのキーワード値を提供する機能がなくなりました。彼らはこれを PHP 5 で修正しましたが、PHP 4 では参照渡しを非推奨にしました!
一般的に配慮が欠けているわけではないと思いますが、この特定の変化に刺されて、口の中に酸っぱい味が残っていると思います. 言語の変更は、何年も前からではないにしても、数か月前にわかることがよくあります。4 から 5 への移行に関する移行ガイドが提供され、バージョンの違いはマニュアルに記載されています。呼び出し時の参照渡しは恐ろしい「機能」であり、他の手段では得られない表現力を開発者に与えるものではありません。それがなくなってよかった(魔法の引用のような他のがらくたとともに)
名前空間の実行が不十分です (以前は名前空間がまったくありませんでした)。名前空間が存在するので、逆参照文字として何を使用しますか? バックスラッシュ!PHP でさえ、エスケープのために普遍的に使用される文字です!
私はこれについて複雑な気持ちを持っています。私の一部は、「とにかく、文字エスケープは文字列の外では意味がない」と考えており、「きっと彼らはもっと良いものを使うことができるだろう」と考えています。しかし、彼らはできますか?わかりません。私は Zend パーサーの開発者ではありません。PHP 5.3 まで名前空間がまったくなかったのは大きな見落としですか? そのとおり。
暗黙的な型変換が広すぎると、バグが発生します。たとえば、浮動小数点数から整数への暗黙的な変換、またはその逆の暗黙的な変換に問題はありません。しかし、PHP (私が最後にチェックしたもの) は喜んで配列を魔法のように整数に変換しようとします。
PHP がこれを行う方法に反対するのは問題ないと思いますが、それが言語を「悪い」ものにすることには反対します。しかし、このトピックにどれだけ座って、弱い型付けと強い型付けについて議論したいのか尋ねてください. (PS 私はまったく知りません)念のため: 引数の型が問題であり、強制によって解決できない場合、PHP は E_WARNING レベルのエラーを発行します。
再帰のパフォーマンスが悪い。再帰は、あらゆる言語で書くための根本的に重要なツールです。複雑なアルゴリズムをはるかに単純にすることができます。貧弱なサポートは許されません。
PHP は Web 用の DSL です。私はこれを 8 年間フルタイムで行っており、再帰を 4 ~ 5 回使用したことがあります。通常は、ある種の迷惑なディレクトリまたは XML トラバーサルです。これは、Web 開発で頻繁に必要とされるパターンではありません。パフォーマンスが遅いことを言い訳するつもりはありませんが、これは生産上の問題というよりも、はるかに学術的な問題です。本当に強力な再帰的パフォーマンスが必要な場合、PHP はすでに不適切な言語です。
関数は大文字と小文字を区別しません。彼らがこれについて何を考えていたのか、私にはわかりません。プログラミング言語は、コンピューターとコードのリーダーの両方に対してあいまいさなしに動作を指定する方法です。大文字と小文字を区別しないと、多くのあいまいさが生じます。
私はこれに完全に100%同意します。
PHP は、処理とプレゼンテーションの結合を推奨しています (実際には必要です)。はい、そうしない PHP を作成することはできますが、実際には (適切な設計の観点から) 間違った方法でコードを作成する方が簡単です。
* うーん、このトピックは非常になじみがあるように聞こえます...
しかし真剣に、私が思うに、100% 絶対に 100% 必要な出力システムを実装できる言語について人々が不平を言うことは驚くべきことです (PHP テンプレート システムの膨大な量とスタイルだけがこれを物語っています) - または - そのすべてのオーバーヘッドをスキップし、直接出力するだけです。これは PHP を悪くするものではありません。これは、PHP を優れたものにする要素の一部です。
PHP のパフォーマンスは、キャッシュなしでは最悪です。PHP 用の商用キャッシング製品を販売している人はいますか? ああ、ほら、PHPの設計者はそうしています。
バイトコード キャッシング (アクセラレータのようなもの) ですか、それとも出力キャッシングですか?
前者の場合、このトピックにどれだけ関心があるかはよくわかりません。アクセラレータは無料で簡単に実行できます。なぜそれが言語の一部ではないのかについて議論することはできますが、最終的にはそれほど重要ではないと思います.
あなたが出力キャッシュについて話しているのなら、私はあなたに何を言うべきかわかりません. 大量のトラフィックを伴う Web プロジェクトでは、キャッシュが必要です (シード ポッドキャスト #27 など)。これは PHP 固有の問題ではありません。
要約すると、あなたは PHP を非常に学術的な意味で「悪い」言語だと考えていると思います。また、前回の投稿では、PHP を使用して「物事を成し遂げる」私のような人々から、おそらく反対票を投じられたでしょう。
2 番目に評価の高い回答
あなたのすべての批判 (およびその他の批判) は有効です。あなたが PHP を嫌うことは許されていますし、それが期待されていることさえあります。
しかし、繰り返しになりますが、いくつかの利点があります。
- ユビキタス
- 高速 (特にオペコード キャッシュを使用)
- 巨大なコミュニティ (および優れたドキュメント)
- 作品
最後に、他の言語で書くような優れたコードを作成することで、すべてではないにしても多くの欠点を克服できます。PHP でしっかりとした、安全で、良い匂いのするコードを書くことができます。これは、多くの代替手段よりも何倍も高速に実行され、ホストとスケーリングが容易になります。
3 番目に評価の高い回答
PHP について欠けているものは何ですか? 有機的に成長し、管理が不十分な言語の混乱が、貧弱なプログラマーを生み出しているのを見ています。
単純。貧弱なプログラマーが自分の言語に対して非常に防御的であるという事実。;) PHP は習得が容易で、代替手段よりもはるかに簡単です。一度習得すると、1) PHP の何が問題なのか、2) 代替手段がどのように優れているのか、3) どのように切り替えるか、および代替手段の1つを学びます。
そしておそらく、人々はどのような選択肢を持っているのでしょうか? ASP? それ自体には、大部分の Web サーバー (Apache) で実行できないことから、ばかげた過剰設計された設計の選択 (Web フォーム? Viewstate? 非同期の "要求が傍受され、順次実行される AJAX) まで、多くの問題があります。 ) Ruby on Rails? まあ, おそらく, どれだけのウェブサーバーが再びそれをサポートしているかを除けば? 現時点では簡単にアプローチできるわけではありません. それに遅い. だからおそらくPHPの「強み」は本当に良い代替手段が存在しないことです. 少なくともこれが私が理由です.可能な限り、すべての Web プログラミングに近づかないでください.PHP は最悪ですし、私はどの代替手段にもあまり熱心ではありません.
PHP には、おかしなことでもないほど多くの根本的な問題があります。Unicodeサポートの欠如から、予期しないセキュリティホールにつながることが多い多くの暗黙的な型変換、プレゼンテーションと...他のすべての完全な混合、または(最後にチェックした)使用しないデフォルトのデータベースモジュールまでパラメータ化されたクエリ。データベースへのアクセスと HTML の生成という 2 つの目的のために作成された言語について話しているのですが、どちらもひどいものです。
言語を設計する資格がない、またはできない人々によって設計された言語です。;)