web-dev-qa-db-ja.com

PHPはオブジェクト指向ですか?

同僚と興味深い会話をする機会がありました。それらのほとんどは、フラッシュアクションスクリプトまたはJava開発者です。

PhpがOOPをいかにうまく処理するかについて話しました。 PHPは、ほぼすべてのOOPのものをPHP 5.2または5.3の時点で処理できます。私は間違っていますか?はい/いいえの答えを得ようとはしていませんが、開発者からもっと意見を聞きたいです。

13
user23583

PHP 5.3は、実際にはOOPをかなり適切にサポートしています。

PHPに関するOOPに関する問題は、OOPが実際に言語にボルトで固定されていたのに対して、 JavaやActionScriptなどの言語はコアコンセプトの一部ですが、オブジェクトのセマンティクスが悪いため、両方とも悪いOOP言語と考えています。

PHP最近はOOPに大きく適していますが、問題は次のとおりです。

  1. そこにあるコードベースの大部分(ライブラリ、フレームワーク、カスタムコード)はPHP 5.3
  2. aPIの大部分は手続き型です。 arrayは依然として最も重要で最も使用されるタイプであり、オブジェクトではありません。
  3. PHPプログラマーの大多数は、近い将来、手続き型のスタイルに固執するでしょう。PHPは宣伝しませんOOP、たとえばObjective-Cとは対照的に:Objective-CはCを完全なサブセットとして持つため、allows最も純粋な形式の手続き型プログラミングですが、OOPの使用を明らかに支持しています。

PHPは、従来のすべてのものを単純に取り除くことはできません。 PHP 6がリリースされた場合、そのほとんどがスローされますが、おそらく使用されません。その目的を無効にします。
そしてPHPは、徐々に廃止されるものの十分なペースをとることができませんでした。そのため、良い言語に必要な明確さと一貫性が得られるまでには時間がかかります。

個人的に、私はPHPが本当に嫌いです。単純に、そのすべての手荷物、API、およびすべてのためです。
ただし、Flow3、Symfony、CakePHP、Codeigniterなどのフレームワークは、OOPおよびその他の強力なパラダイムの強固な基盤を提供します。ActionScriptとJavaの制限により、十分な労力をかけて(抽象化レイヤーの上にPHP欠陥)、PHPは、同等またはそれよりも優れている場合があります。

まとめると、PHPのOOP機能には特に問題はありません。したがって、これは悪い言語ではないと言えます[〜#〜] oo [〜#〜]。ただし、 OOPファシリティが実際にはintegratedでなく、むしろ単に含まれているしたがって、それはbad OO言語であると主張できます。

34
back2dos

"can can"は "supports"と同じではないことがわかります。つまり、コードを適切に構造化すれば、C "can handle" OOPでさえ、重要な点に注意が必要です。問題は、言語が単にenabling OOPを超えて、OOPをプログラムの最も自然な方法にすることによって奨励するかどうかです。

私の(確かに限られた)経験では、PHP 5.n方言はこれを行いません。 OOPから抜け出し、純粋に手続き型のコードにするのは簡単です。 (PHPは悪い言語だとは思わないことに注意してください。PHPが悪い言語だと思う理由はたくさんありますが、 OOPサポートはそれらの1つではありません。

言語のオブジェクト指向性には、実際には2つの定義があります。オブジェクト指向が独自の組み込み構文と標準ライブラリである方法と、それをプログラミングするソフトウェアプログラマーに与える影響です。

最初の定義によってPHPはリストの一番下にあるようです。人々はしばしば非オブジェクト文字列と配列をこれの証拠として引用します。私の意見では、この定義は本当に重要ではありません。本当にneed oneであれば、いつでもオブジェクトにラップできますが、そうではないため、人々はラップしません。通常、コードに与える唯一の違いは、function(var)を変更することです。 to var.function()。構文だけでは、非OOPからOOPに変更されません。

2番目の定義については、人々はそのような構造を強く適用する言語でさえも不十分なオブジェクト指向コードを書くことができ、優れたオブジェクト指向コードを書く人々は、構文の癖に悩まされることを除いて、言語による影響をほとんど受けません。言い換えれば、私の経験では、悪いオブジェクト指向言語はなく、悪いオブジェクト指向programmersだけです。 PHPは、その点で他の言語と同じくらい優れています。

多分一部の言語は学習オブジェクト指向プログラミングに適していますが、開発者によって異なると思います。私にとっては、PerlがOOPをどのように(行ったか)するかについてのLarry Wallのラクダの本を読むまで、クリックしませんでした。参照をクラスに属しているものとして明示的に祝福しなければならないことは、オブジェクトのインスタンスが実際に何であるかとクラスが何であるかという点を私に理解させました。一部の人々は、学習のためにJavaのすべてのオブジェクトを常時使用するアプローチを支持しています。 OOPはアーキテクチャ上の懸念事項であるため、基本的な変数、式、シーケンス、選択、および反復を理解しておくと習得が容易になるため、フォアインしない言語はすべてOOPすぐにあなたに私の意見では教育的な利点があります。

私の妻がJavaでプログラミングクラスを紹介したとき、彼女は常にpublic static void mainそしてすべてをクラスに入れましたが、彼女はまだ理解する背景がありませんでしたが、彼女はそれが必要だと信頼するためだけに先生から言われました。私はそれを説明しようとしましたが、変数についてほとんど知らなかった人に、コードの他の部分がそれらにアクセスするのを防ぐことがなぜ有用であるか、そしてそれを分割する方法を決定する方法を説明することは非常に困難です。最初に手続き型プログラミングを学ぶことは悪い習慣を教え込むと主張するかもしれませんが、理解できないコードをコピーして貼り付ける習慣はどうですか?

8
Karl Bielefeldt

PHPはオブジェクト指向プログラミングではbadではありません。ただし、PHPencouragesの性質上、適切なオブジェクト指向ソフトウェア開発と、多くの本とチュートリアルではなく、迅速なハッキングと修正OOPの概念を完全に無視します。OOPの概念は問題なくサポートできますが、それらを適用することを知っているのは開発者の責任です。ほとんどのことは、 PHP "true"で実行できることOOP JavaまたはC#のような言語ですが、これらの言語にはより多くの強制力がありますof OOP PHPよりもテクニック。選択した場合、手続き型スタイルで使用できます。

正確な引用を思い出せませんが、生のPHPをthen-new Ruby on Railsを使用することと比較して、次のように書きました: Railsは、良いコードを簡単に書けるようにし、悪いコードをハードに書けるようにします。PHP悪いコードを簡単に書けるようになり、良いコードを書くのが難しくなります。PHPに関する行は、OOPでそれをほぼ要約しています。それは、優れた言語になることは完全に可能ですOOそうするのは難しい。

5
Wayne Molina

PHP分類

PHPは グルー言語 であり、BASHやPerlと同じです。それは得意ですが、他には何も得意ではなく、いくつかの深刻な作業を残します。言語は設計されていません。さまざまなコードを無計画にハッキングして(コードと修正)、単に進化しただけです。

コンパイルされた言語

PHPとは対照的に、Javaは適切に設計されたコンパイル済み言語です。言語を定義するJSR、エンタープライズレベルのフレームワーク、EJB、JMS、ESB、Spring、Strutsなどの概念が多数あります、休止状態、およびその他。

エンタープライズソフトウェア

エンタープライズシステムの観点から、Java EEは目的に合ったソリューション(Enterprise Edition)ですが、PHPは、コストを削減しようとする企業で使用されています。資格の少ない安価な労働者を雇う。

PHPをさまざまなフレームワークを使用してエンタープライズセグメントにドラッグするためにかなりの労力が費やされています。特に、 Zend Framework 2 です。ここでの基本的な問題は、オブジェクト指向ではありません。 PHP、しかしそれはデザインの欠如、強い型付けの欠如、標準的な問題(すべてに対するハックの種類)に対する非標準的な解決策、そして規定されたアーキテクチャの完全な欠如です。

ソフトウェア設計(アーキテクチャーについて議論)

PHPを使用すると、ソフトウェアを設計する負担は、非常に貧弱な仕事をしている開発者次第です。つまり、多くの場合、まったくアーキテクチャを持たず、ランダムにコードを作成して修正するだけです。セキュリティとトランザクションが欠落しているため、開発者が対応する必要があります。 Javaでは、1つのソリューションは注釈付きEJBです。また、PHPでは、例外のキャッチを省略したり、さまざまなエラーを発生させたりしても、何も起こらないことも考慮してください。それは実行時までです。 Javaでは、設計時に直接警告とエラーが表示されます。これは堅牢性と呼ばれますが、PHPを使用すると、夢を見続けることができます。

マルチスレッド

PHPはマルチスレッドをサポートしていません。コードは常にシングルスレッドです。これは、より大きな負荷の下での重要な問題のパフォーマンスを妨げます。 Java EEを使用すると、Runnableインターフェースなどを介してマルチスレッドが完全にサポートされます。

サポートと標準

また、デプロイメント、Webサービス、およびその他の標準についても検討してください。 Javaには、Oracle、IBM、RedHat、Apacheなどの大企業がありますが、PHPにはZendしかありません。

結論

結論として、PHPは非常に悪いオブジェクト指向言語です。厳密に言えば、それはオブジェクト指向でもありませんが、OOPは手続き型プログラミングと混同されています。PHPはBASHのような接着剤としてのみお勧めしますが、深刻な作業にはJava EE。

関連する考え

最新のZend Framework 2の主な取り決めは、Java EEのようにしようとしているが、少なくともリモートで比較できる利用可能なパッケージ、機能、ツール、オートメーションのセットを提供することに完全に失敗していることです。エラーチェック、アーキテクチャ、デザイン、その他すべて。

私の経験では、複雑なプロジェクトでは、JavaよりもPHP)を使用する方がコストが高くなります。

そのようないくつかの噂もありますPHPはかなり恐ろしいプログラミングの略です。確認できます。

4
user42242

言語はOOPをどの程度うまく処理しますか?私はむしろOOの方法でプログラムをどれだけうまく書くことができるか尋ねます。私はJavaすべてを作ることによって パブリックスタティック
PHPはOOPをサポートしています。 OOの方法でのみ書くことを強制するものではありません。どの程度うまく処理できるかは、プログラムをオブジェクト指向で理解し、書く方法によって異なります。

3
Srisa

PHPは Traits! (5.4以降)をサポートしています。水平方向の再利用をネイティブに処理できる言語であれば、十分に十分ですOO私の本の言語。

2
dukeofgaming

さて、私たちは言語をより多くする理由を考えなければなりませんOOそして、そのようにした理由はそこにあります。

JavaScriptは、ブラウザ環境で解釈言語として実行することを意図したECMAScriptの実装です。インタプリタ言語であると考えられているという事実は、その構文/振る舞いのデザインに非常に大きな影響を与えました。

たとえば、OOPには従いません。しかし、それ以外にも、OO prgrammerは関数の巻き上げのようなその動作の一部を非常に混乱させるかもしれません。

繰り返しになりますが、OO C++、Java、C#などの言語を使用して、コンパイラを強力なタイピングのように効率的にすることができます。ただし、JSはインタプリタ環境で実行されるため、代わりに、強い型付けに従わない緩く型付けされた言語です。

上記の動作の違いとは別に、JSのように多くの構文上の違いがありますオブジェクトリテラル表記これは、C#プログラマーを非常に混乱させる可能性があります。ただし、C#には、コンパイルされた言語であり、そのような構文は伝統的に使用されていないため、構文のようなオブジェクトリテラルもありませんOOコードスタイル。

ここで、言語が適切なオブジェクト指向であるかどうかを決定するもう1つのポイントがあります。それは、C++から進化したものかどうかです。 Java、C#はC++から進化し、同様の動作と構文に従っているため、大きなコミュニティはそのような動作と構文を(OO事のみ)と認識し、そのような類似性を阻害しない言語は、単にオブジェクト指向ではありません。

ただし、OOは非常に抽象的な概念であり、構文スタイルに関連付けられておらず、特定の動作プロパティにも関連付けられていないことを忘れないでください。

そしてPHPは非常にうまくOOです。Java、C++、C#のように見た目も感じもしないだけで、C#はそれを貧弱にしませんOO言語。 JavaそしてC#。

だから、今まで私の頭は非常によくOOでした。それから私はとても良い本「Wrox Pro」からJSを学びました、そしてそれはちょうど私を圧倒しました。私はJSの動作と構文の明確さを楽しんだだけです。次に、構文のようなオブジェクトリテラルがC#にあることに気付きました。そして今、学びながらPHPそれは両方の世界から多くのものをもたらすかのように感じています。

私たちが本当にしなければならないことは、オブジェクト指向の実装中に言語が持つ構文と動作の微妙さを学ぶことだけです。それらを習得したら、これがより良いと思い始めるかもしれませんOO実装。

1
Maha