1

私は最近、既存のPHPアプリケーションの作業を開始しましたが、このアプリケーションのスケーラビリティを向上させるために何をすべきかについて、少し問題があります。私はC#.NETのバックグラウンドを持っているので、関心の分離という考え方は私にとって目新しいものではありません。

まず、私が探しているものを正確に伝えたいと思います。現在、このアプリケーションはかなり適切なサイズであり、約70のデータベーステーブルと約200ページで構成されています。ほとんどの場合、これらのページはデータベースに対してCRUD操作を実行するだけであり、実際にプログラムを多用することはめったにありません。現在、ほとんどすべてのページがこれに類似したコードを使用しています。

$x = db->query("SELECT ID, name FROM table ORDER BY name");
if ($x->num_rows > 0) {
    while ($y = $x->fetch_object()) {
        foreach ($y as $key => $value)
            $$key = $value;

明らかに、これは私が取り組んでいるはずのアプリケーションほど大きなアプリケーションには適していません。現在、私はC#.NETのバックグラウンドを持っており、小規模なアプリケーションを構築し、通常はアプリケーション内のオブジェクトごとに小さなビジネスオブジェクトを構築することに慣れています(データベーステーブルとほぼ1対1で一致します)。彼らはこれの形に従います:

namespace Application
{
public class Person
{

            private int _id = -1;
    private string _name = "";

    private bool _new = false;


    public int ID
    {
        get{ return _id; }
    }

    public string Name
    {
        get { return _name; }
        set { _name = value; }
    }


    public Person(int id)
    {
        DataSet ds = SqlConn.doQuery("SELECT * FROM PERSON WHERE ID = " + id + ";");

        if (ds.Tables[0].Rows.Count > 0)
        {
            DataRow row = ds.Tables[0].Rows[0];

            _id = id;

            _name = row["Name"].ToString();
        }
        else
            throw new ArgumentOutOfRangeException("Invalid PERSON ID passed, passed ID was " + id);         
    }

    public Person()
    {
        _new = true;
    }

    public void save()
    {
        if (_new)
        {
            doQuery(" INSERT INTO PERSON " +
                " ([Name]) " +
                " VALUES " +
                " ('" + Name.Replace("'", "''") + "'); ");
        }
        else
        {
            SqlConn.doNonQuery(" UPDATE PERSON " +
                " SET " +
                " [Name] = '" + _name.Replace("'", "''") + "' WHERE " +
                " ID = " + _id);
        }

    }

簡単に言うと、テーブルを模倣する属性、プロパティ、情報を取得するコンストラクター、およびsaveオブジェクトに加えられた変更をコミットする呼び出されるメソッドがあります。

私の実際の質問に移ります:まず第一に、これは物事を行うための良い方法ですか?それはいつも私にとってうまくいきました。第二に、そしてもっと重要なことに、これはPHPで物事を行うための良い方法でもありますか?PHPの緩い型付けが、私が物事を行う方法に問題を引き起こしていることにすでに気づきました。また、メソッドのオーバーロードはまったく新しいものではありません。これが良い習慣ではない場合、このプロジェクトを3つの層にどのように適応させるべきかについての良い例はありますか?または、おそらく私は何らかの理由でこれを試みるべきではありません。

質問が長かったことをお詫びしますが、私はインターネットで1週間ほど掘り下げていましたが、役に立たなかったのです。私が見つけたのは、構造標準ではなく構文標準だけです。

前もって感謝します。

4

2 に答える 2

3

従うことができるいくつかのパターンがあります。私はMVC パターンを自分で使用するのが好きです。MVC とは、ユーザー インターフェースの操作を 3 つの異なる役割に分割することです。ただし、他のパターンもありますが、わかりやすくするために (投稿の最後の長さは MVC にのみ入ります)。SOLID の原則を使用している限り、どのパターンに従うかは問題ではありません。

私は C#.NET のバックグラウンドを持っているので、関心の分離という考えは私にとって目新しいものではありません。

それは素晴らしいことです。PHP の学習は、現時点では実装の詳細にすぎません。

明らかに、これは、私が取り組んでいるアプリケーションと同じくらい大きなアプリケーションには適していません。

同意してよかった:-)


MVC パターンでは、次のようになります。

モデル: 「すべての作業」を行うビュー: プレゼンテーション処理する
コントローラー: 要求を処理するコントローラー

ページをリクエストすると、コントローラーによって処理されます。コントローラーが何らかの作業を行う必要がある場合 (ユーザーの取得など)、モデルにこれを行うように要求します。コントローラーが必要な情報をすべて取得すると、ビューがレンダリングされます。ビューはすべての情報のみをレンダリングします。

あなたが話していた人物オブジェクトは、MVC パターンのモデルになります。

PHP のルーズ タイピングが私のやり方に問題を引き起こしていることに既に気付きました。

PHP の緩やかな型付けは (自分が何をしているのかわかっている場合) かなり便利であると同時に、最悪の場合もあります。=3 つの記号を使用することで、いつでも厳密な比較を行うことができることに注意してください。

if (1 == true) // truthy
if (1 === true) // falsy

また、メソッドのオーバーロードはまったく新しいものではありません

PHP は実際にはメソッドのオーバーロードを実際にはサポートしていませが、模倣することはできます。次の点を考慮してください。

function doSomething($var1, $var2 = null)
{
    var_dump($var1, $var2);
}

doSomething('yay!', 'woo!'); // will dump yay! and woo!
doSomething('yay!'); // will dump yay! and null

別の方法は次のとおりです。

function doSomething()
{
    $numargs = func_num_args();
    $arg_list = func_get_args();
    for ($i = 0; $i < $numargs; $i++) {
        echo "Argument $i is: " . $arg_list[$i] . "<br />\n";
    }
}

doSomething('now I can add any number of args', array('yay!', 'woo!', false));

または、何らかの理由でこれを行うべきではないかもしれません。

もちろん、試してみるべきです。プログラミングの経験があれば、それほど難しいことではありません。


他に質問がある場合は、明日のPHP チャットでアイドリング中の私を見つけることができます(私は今、本当に少し眠る必要があります :-) )。

于 2012-04-05T23:16:05.123 に答える
0

これは物事を行う良い方法ですか?

理想的な方法はありません。決められた状況には善悪があります。

タイピングに関しては、PHP はそれを失いません。これを動的型付けと呼びます。

アーキテクチャについては、中規模から大規模のエンタープライズレベルの Web アプリケーションを開発する場合、日常的にパフォーマンスについて話しがちです。

開始するには、次のような最もよく知られている PHP フレームワークのいくつかについて読むことをお勧めします。

  • ゼンド
  • シンフォニー
  • こはな

そこから建築について考え始めることができます。

于 2012-04-05T22:56:30.113 に答える