2

webbapplication で家を建てるために php でクラスを作成しようとしています。クラスとオブジェクトを最も効果的な方法で使用しているかどうかわかりませんね。私はおっと初心者です...

これは、ユーザーが家を建てたいという jquery からのリクエストです。

// Add house
$.get('stats.php?house=cottage', function(data){
    // if(data == 1) // Build a house
});

これは stats.php ファイルです。

require_once('House.php');
// Requests to see if the requirements to build a new building is met, if so, return 1, else return 0.
if(isset($_GET['house'])) {
    // Check with database to se if there is enough resources.
    $house = new House;
    $house->type = $_GET['house'];
    if($house->isResources) {
        $house->buildHouse;
        echo 1; // This is the answer to the ajax request.
    } else {
        echo 0;
    }
}

そして、ここに私のクラスファイルがあります:

<?php
class Build {

    public $type;

    function isResources() {
        // Check resourses in database, compare that to the number of houses already built, and level.
        // return true; // If requirements are met, otherwise return false.
    }

    function buildHouse() {
        // Insert coordinates and $type into databse.
    }
}
?>

上記以外のコードをクラス内で実行したことはありません。これがクラスを作成する最良の方法であると思われるかどうか疑問に思っています。コーディングを進める前に...ありがとう!

4

4 に答える 4

5

[編集] Web アプリケーションのデザイン パターンに関するこの回答を見つけました。これは PHP ではありませんが、それでも適用でき、すぐに私の史上最高のお気に入りの 1 つになりました。

[編集 2]この記事は、PHP で使用する可能性のあるさまざまな一般的な OO パターンの例を説明するのにも非常に適しています: http://www.phptherightway.com/pages/Design-Patterns.html

[編集 3]番号 1 を追加しました。これは、OOP について最も重要なことだと私は信じています。

オブジェクト指向設計を学ぶ最良の方法は、Java のような純粋な OOP 言語を使用することです。そうしないと、スパゲッティとミートボールになってしまいます。

そうは言っても、アイデアを得るために、PHP の他の OO プロジェクトを参照することもお勧めします。Wordpress や Drupal などの人気のあるプロジェクトに取り組み始めた場合は、OO 設計の点で混乱しているため、パターンにとらわれないように教えてください。ただし、クラスと適切な OO 設計パターンで PHP を使用するプロジェクトはたくさんあります。興味のあるものを取り、そのコードを調べて、独自のコードを書き始める前に作業してください。

私はこれら 2 つのことを行い、これ(PHP での最初の OO プロジェクト) に行き着きましたが、これは完璧な例ではないかもしれません (多くの設計上の欠陥から多くのことを学んだので、改善できることはわかっています)。それほど悪くはありませんでした。

詳細については、コメントに記載されているように、クラスの名前を Build ではなく House にする必要があるため、インスタンス化 (オブジェクトの作成またはビルド)new House()を行う必要があります。しかし重要:

  1. インターフェイスを使用する: それが OOP のすべてです。House は Building を実装し、おそらく Residence も実装します。抽象クラスを作成する前によく考えて (実装されたメソッドをオーバーライドし続けますか? 代わりにインターフェイスを作成します)、インスタンス化できないクラスのみを拡張するようにします (必要なだけ深く掘り下げることができますが、5 つの異なる世代のようにはしたくありません)。オーバーライドされたメソッドを知っているアプリでインスタンス化されているオブジェクト. 私は、ある時点で祖父母のメソッドを呼び出し、ある時点で子のオーバーライドされたメソッドを呼び出す親のメソッドを呼び出している子のオーバーライドされたメソッドを見てきました.しばらくすると、簡単な概要だけでは完全に理解できなくなります. 2 世代または 3 世代でも、クラスが多すぎると混乱します)。

  2. 最初にフィルタリングせずに、$_GET パラメーターをオブジェクト プロパティに割り当てないでください。それは面倒で危険です!詳細については、次のリソースを確認してください。

  3. コンストラクターを使用する: 新しい家を作成するときに、そのタイプを直接指定したくありませんか? だから:$house = new House($type)、そして内部House

    function __construct($type){ $this->type = $type; }

  4. 名前空間とクラス オートローダーを使用します。この単純なコード片といくつかの単純なPSR 命名規則により、コード内にrequireまたはincludeまたはを含める必要がなくなります。require_once

    名前空間 myspace; set_include_path('..'.PATH_SEPARATOR.get_include_path()); spl_autoload_extensions(".php"); spl_autoload_register();

    詳細については、これを確認してください: https://wiki.php.net/rfc/splclassloader

  5. サーバー側のコードには、メイン クラスのメイン (静的) メソッドへの呼び出しというエントリ ポイントが 1 つだけある必要があります。残りはすべて、class定義内のコードからの静的メソッドまたはクラス インスタンス (オブジェクト) への呼び出しである必要があります。Web サーバーとして Apache を使用している場合、書き換えモジュールを有効にして .htaccess を操作できるようにすると、.htaccesshttp://myserver/mypageの代わりにhttp://myserver/main.php?function=mypage. すべてのコンポーネントをブラックボックス化 (カプセル化) し、コンポーネント間の動作のマングリングを回避するように注意する必要があります。プロジェクトのさまざまな部分の相互依存性が高いほど、それらを独自の適切な方法で成長させるのに苦労する必要があります (グローバル状態を避ける))。DRY は、コードを共有しなければならないと言っていますが、2 つのフローが交わる適切な設計に適合するため、そこに固定されている共有コードの小さな断片と、2 つの異なるフローを結ぶ絡み合った結び目の違いを知ることもできなければなりません。 >< と || をグラフィカルに表現すると、別々に開発する必要があります。

  6. 4 に関連し、石で書かれていませんが、非常に便利です。依存性注入を使用すると、偽の入力で各クラスを個別にテストできます。Red-Green-refactor は、Web アプリに適用するのに最適なプログラミング マントラの 1 つです。少なくとも、典型的な使用例(完全な完全なバッテリーではありません。安定したリリースを提供するまで完全なNASAに行く必要はありません..)のための簡単で愚かな最小限のテストを考えられない場合は、あなたがしようとしていることは何でもあなたはおそらくそれを間違っています。すぐに実行できるので、開始する前に実行してください。(これを信じてください。後で、ほぼ毎回、多くの時間を節約できます。)

  7. ドキュメントに注意してください。コードはそれ自体を説明するものであり、すべての行にコメントする必要はありません。ドキュメンテーションは、他の人があなたのコードを使用する方法を示しているため、各パブリック メソッドの機能、その入力パラメーター、およびその出力に関する明確で簡潔な説明に集中する必要があります。エラーや制限など、特殊なケースをどのように処理するかを明確に説明してください。

今思いつくのはそれだけです。また、クラスに関する php.net チュートリアルを読むことをお勧めします: http://php.net/manual/en/language.oop5.phpと、別の記事http://www. ibm.com/developerworks/library/os-php-7oohabits/#resources

于 2013-09-21T11:30:10.980 に答える
0

Okie さん、PHP で OO を学習するための優れた方法がすでにたくさん提案されているので、簡単な回答を追加します。

これまでのところ、Symfony 2 を提案した人は見たことがありませんが、私の意見では、最新の PHP 5 の機能を利用して OO フレームワークを構築する (PHP が許す範囲で) 真に優れたフレームワークです。Symfony 2 を使用すると、多くの有用なプラクティス、標準、および設計パターンを学ぶことができます。ただし、初心者にとって SF2 は非常に複雑であることを警告しなければなりません。時間がある場合はそれを選択し、それ以外の場合はそのミニ フレームワークを使用します。通称シレックス。

とにかく、あなたの質問は、コードが正しく見えるかどうかでした。個人的には、少しクリーンアップを使用する可能性があると思います。入力データをサニタイズする必要があります。そのようにエコーするだけでなく、正しいヘッダーを使用して ajax 応答を送信することもできます。

于 2013-09-21T17:11:03.040 に答える