私は同僚と興味深い会話をする機会がありました。それらのほとんどは、フラッシュアクションスクリプトまたはJava開発者です。
phpがOOPをうまく処理することについて話しました。PHPは、PHP 5.2または5.3のほとんどすべてのOOPを処理できると述べました。私が間違っている?はい/いいえで答えようとはしていませんが、開発者からもっと意見を聞きたいです。
私は同僚と興味深い会話をする機会がありました。それらのほとんどは、フラッシュアクションスクリプトまたはJava開発者です。
phpがOOPをうまく処理することについて話しました。PHPは、PHP 5.2または5.3のほとんどすべてのOOPを処理できると述べました。私が間違っている?はい/いいえで答えようとはしていませんが、開発者からもっと意見を聞きたいです。
回答:
PHP 5.3は、実際にはOOPをかなり適切にサポートしています。
OOPに関するPHPの問題は、OOPが実際に言語にボルトオンされただけであるのに対して、JavaやActionScriptのような言語ではコアコンセプトの一部であるということです。
最近のPHPはOOPに適していますが、問題は次のとおりです。
array
まだ最も重要で最も使用されるタイプであり、オブジェクトではありません。PHPはすべてのレガシーなものを単純に取り除くことはできません。PHP 6がリリースされた場合、ほとんどの場合、PHP 6は使用されません。それはその目的に反します。
そして、PHPは、物事を徐々に廃止するのに十分なペースをとることに失敗しました。そのため、優れた言語に必要な明確さと一貫性が得られるまでには時間がかかります。
個人的には、私はPHPが本当に嫌いです。その理由は、そのすべての手荷物、API、その他すべてのためです。
ただし、Flow3、Symfony、CakePHP、Codeigniterなどのフレームワークは、OOPやその他の強力なパラダイムの強固な基盤を提供します。ActionScriptとJavaの制限により、十分な労力(PHPの欠陥の上の抽象化レイヤー)により、PHPは同等またはそれを凌ぐことができます。
要約すると、PHPのOOP機能には特に問題はありません。したがって、それは悪いオブジェクト指向言語ではないと言うことができます。ただし、PHPには特に問題があるものが多くあります。たとえば、OOP機能が実際には統合されておらず、単に組み込まれているなどです。したがって、これは悪い OO言語であると言えます。
「処理可能」は「サポート」と同じではないことがわかります。つまり、コードを適切に構造化すれば、本質的にはCでさえもOOP を処理できます。問題は、その言語が、OOPを最も自然なプログラミング方法にすることにより、OOPが単にそれを奨励することを可能にするだけではないかどうかです。
私の(確かに限られた)経験では、PHP 5.nの方言はこれを行いません。OOPから抜け出し、ほとんど純粋に手続き型のコードに入れるのは簡単すぎます。(この理由から、PHPが悪い言語だとは思わないことに注意してください。PHPが悪い言語だと思う理由はたくさんありますが、OOPサポートはそれらの1つではありません。)
$e = function_that_returns_an_array()[0];
。修正するには、次の手順を実行します$a = function_that_returns_an_array(); $e = $a[0];
。関数呼び出しの結果を直接使用できない構文の言語は、私を止めさせます。また、次の数値が10進数で何であるかを教えてください0246875
。(ヒント:その字句解析器を実装するための愚かな方法を見つけることはできません!)PHPはこの種の愚かさに満ちています。
言語のオブジェクト指向性には、実際には2つの定義があります。オブジェクト指向が独自の組み込み構文と標準ライブラリである方法と、ソフトウェアプログラマーがオブジェクト指向を記述するためにどのような影響を与えるかです。
最初の定義では、PHPはリストの一番下にあるようです。多くの場合、これの証拠として非オブジェクト文字列と配列が挙げられます。私の意見では、この定義は重要ではありません。本当に必要な場合はいつでもオブジェクトにラップできますが、人々は必要ないのでそうしません。通常、コードに加える唯一の違いはに変更するfunction(var)
ことvar.function()
です。構文だけでは、非OOPからOOPに何かが変わることはありません。
2番目の定義については、そのような構成を強力に実施する言語でさえ、オブジェクト指向の不十分なコードを書くことができますし、オブジェクト指向の優れたコードを書く人々は、構文の癖に悩まされることを除いて、言語の影響をほとんど受けません。言い換えれば、私の経験では、悪いオブジェクト指向言語はなく、悪いオブジェクト指向プログラマーだけがいます。PHPは、その点で他の言語と同じくらい優れています。
一部の言語はオブジェクト指向プログラミングの学習に適しているかもしれませんが、開発者によって異なると思います。私にとっては、perlがどのようにOOPを行うのかについてのLarry Wallのラクダの本を読むまでクリックしませんでした。クラスに属するものとして参照を明示的に祝福しなければならないので、オブジェクトのインスタンスが実際に何であるか、クラスが何であるかという点を私は本当に感じました。一部の人々は、Javaのすべてのオブジェクトを常に学習するアプローチを好んでいます。OOPはアーキテクチャ上の関心事であるため、基本的な変数、式、シーケンス、選択、反復を知っていれば簡単に学ぶことができるため、OOPをすぐに思いつかない言語は、私の意見では教育上の利点があります。
私の妻は、Javaを使用したプログラミングクラスのイントロを学んだときpublic static void main
、クラスにすべてを置くことに常に不満を抱いていました。私はそれを説明しようとしましたが、変数についてほとんど学んでいない人に、コードの他の部分が変数にアクセスするのを防ぐことが有用である理由と、それを分割する方法を決定する方法を説明するのは非常に困難です。手続き型プログラミングを学ぶことはまず悪い習慣を植え付けると主張するかもしれませんが、理解できないコードをコピーして貼り付ける習慣はどうでしょうか?
PHPはオブジェクト指向プログラミングにとって悪くありません。ただし、PHPの性質上、適切なオブジェクト指向ソフトウェア開発と比較して、迅速なハックと修正が推奨され、多くの書籍やチュートリアルではOOPの概念が完全に無視されています。OOPの概念をうまくサポートできますが、それらを適用することを知るのは開発者の責任です。JavaやC#のような「真の」OOP言語でできることはほとんどPHPでできますが、これらの言語はPHPよりもOOPテクニックを強化しています。
正確な引用は思い出せませんが、それは生のPHPを当時の新しいRuby on Railsの使用と比較した人からのもので、次のようなものでした。PHPを使用すると、悪いコードを簡単に記述でき、良いコードを簡単に記述できます。 PHPについての行は、OOPでほぼまとめています。優れたオブジェクト指向言語になることが完全に可能ですが、そうするのが少し難しくなります。
PHPは、BASHやPerlのようなグルー言語です。それは得意ですが、他のことは得意ではないので、いくつかの深刻な仕事を残してください。言語は設計されていません。それは単に、さまざまなコードを偶然の方法で一緒にハックすることによって進化します(コードと修正)。
PHPとは対照的に、Javaは適切に設計されたコンパイル言語です。言語、EJB、JMS、ESB、Spring、Struts、Hibernateなどの多くのエンタープライズグレードのフレームワークおよび概念を定義するJSRがあります。
エンタープライズシステムの観点から見ると、Java EEは目的に合ったソリューション(Enterprise Edition)であるのに対し、PHPは資格の低い安い労働力を雇ってコストを削減しようとしている企業で使用されています。
さまざまなフレームワークを使用して、PHPをエンタープライズセグメントにドラッグする多大な努力が行われています。最も注目すべきは、Zend Framework 2です。ここでの基本的な問題は、PHPのオブジェクト指向ではありませんが、デザインの欠如、強力なタイピングの欠如、標準的な問題に対する非標準ソリューション(すべてのハッキングの種類)、および所定のアーキテクチャの完全な欠如です。
PHPを使用する場合、ソフトウェアを設計する負担は、非常に貧弱な仕事をしている開発者にかかっています。つまり、多くの場合、アーキテクチャをまったく持たず、ランダムにコーディングして修正するだけです。セキュリティとトランザクションが欠落しているため、開発者が足を踏み入れる必要があります。Javaでは、注釈付きEJBが1つのソリューションです。また、PHPでは、例外のキャッチを省略したり、さまざまなエラーを起こしたりしても何も起こらないという事実を考慮してください。それは実行時までです。Javaでは、設計時に直接警告とエラーが発生します。それはロバストネスと呼ばれますが、PHPを使用すると夢を見続けることができます。
PHPはマルチスレッドをサポートしていません。コードは常にシングルスレッドです。これは、より重い負荷の下での自明でない問題に対するパフォーマンスを妨げます。Java EEでは、たとえばRunnableインターフェイスを介してマルチスレッドが完全にサポートされます。
また、展開、Webサービス、およびその他の標準についても考慮してください。JavaにはOracle、IBM、RedHat、Apacheなどの大企業がありますが、PHPにはZendしかありません。
結論として、PHPは非常に悪いオブジェクト指向言語です。厳密に言えば、オブジェクト指向でさえありませんが、OOPは手続き型プログラミングと混同されるため、バージョン5から悪いハイブリッドです。PHPはBASHのような接着剤としてのみお勧めしますが、真剣な仕事にはJava EEを使用します。
最新のZend Framework 2との主な取引は、Java EEのようになろうとしているが、利用可能なパッケージ、機能、ツール、自動化、エラーチェック、アーキテクチャ、設計、およびすべて。
私の経験では、Javaよりも複雑なプロジェクトにPHPを使用する方が費用がかかります。
PHPがPretty Horrible Programmingを表しているなどの噂もあります。これらを確認できます。
さて、私たちは言語をよりオブジェクト指向にするものと、それをそのようにした理由を考えなければなりません。
JavaScriptはECMAScriptの実装であり、ブラウザ環境で解釈言語として実行することを意図しています。解釈された言語であると考えられるという事実は、その構文/動作設計に非常に大きな影響を与えました。
たとえば、OOPには従いません。しかし、それ以外にも、OOプログラマーは、関数の巻き上げなどの動作の一部を非常に混乱させるかもしれません。
繰り返しになりますが、C ++、Java、C#などのオブジェクト指向言語には、強力な型付けのようにコンパイラーを効率的にするための多くのものがあります。ただし、JSはインタープリター環境で実行されるため、厳密な型付けではなく、緩やかに型付けされた言語です。
上記の動作の違いとは別に、JSにはC#プログラマを混乱させる可能性のあるオブジェクトリテラル表記があるなど、多くの構文上の違いがあります。ただし、C#には、コンパイルされた言語であり、従来のOOコードスタイルではないため、そのような構文はめったに使用されませんが、構文のようなオブジェクトリテラルもあります。
言語が良いオブジェクト指向かどうかを決定するもう1つのポイントがあります。それはC ++から進化したものですか。Javaとして、C#はC ++から進化し、同様の動作と構文に従うため、大きなコミュニティはそのような動作と構文を唯一のOOのものと認識しており、そのような類似性を阻害しない言語は単にOOではないと考えています。
しかし、オブジェクト指向は非常に抽象的な概念であり、どの構文スタイルにも特定の動作プロパティにも結び付けられないことを忘れないでください。
PHPはオブジェクト指向です。Java、C ++、C#のように見えたり感じたりしないだけでは、オブジェクト指向言語が貧弱になりません。さて、私はC ++、次にJava、そしてC#を学びました。
だから、今まで私の頭は非常にうまくオブジェクト指向でした。それから、非常に良い本「Wrox Pro」からJSを学びました。私は、JSの動作と構文の違いを楽しんだだけです。次に、オブジェクトリテラルのような構文がC#にあったことを認識します。そして今、PHPを学んでいる間、私はそれが両方の世界から多くのものをもたらすかのように感じています。
私たちが本当にしなければならないのは、オブジェクト指向の実装中に言語が持つ構文と動作の微妙さを学ぶことです。それらをマスターしたら、これがより良いオブジェクト指向実装であると考え始めるかもしれません。