2012-04-05 9 views
1

私は最近、既存のPHPアプリケーションの作業を開始しました。このアプリケーションのスケーラビリティを改善するためには、ちょっとした問題があります。私はC#.NETのバックグラウンドから来ているので、懸念の分離のアイデアは私には新しいものではありません。よく分離されたPHPアプリケーションの標準

まず、正確に何を探しているか教えてください。現在のところ、このアプリケーションのサイズはかなり大きく、約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; 

を明らかに、これは私が働いてことになっています1ほどの大きさであるアプリケーションに最適ではありません。現在、私はC#.NETのバックグラウンドを持ち、小規模なアプリケーションを構築し、アプリケーション内のオブジェクトごとに小さなビジネスオブジェクトを構築していました(ほとんどの場合、データベーステーブルと1対1で一致します)。彼らは単にオブジェクトに加えられた変更をコミットしますテーブルを模倣属性、プロパティ、情報を引き出し、コンストラクタ、およびsaveというメソッドを持って、短い用語で

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); 
     } 

    } 

:彼らはこの形式に従ってください。

私の実際の質問には:まず、これは良いことですか?それは常に私のためにうまくいった。もう1つ、もっと重要なのは、これもまたPHPでやりたいことですか?私は既にPHPの緩いタイピングが私のやり方で問題を引き起こしていることに気がつきました。メソッドのオーバーロードも全く新しいものではありません。これは良い習慣ではない場合、どのように私は3つの層にこのプロジェクトを適応する必要があります良い例がありますか?または、何らかの理由でこれをやろうとしないでください。

質問の長さは申し訳ありませんが、インターネットで1週間ほど掘り下げているわけではありません。構造基準ではなく構文基準があります。

ありがとうございます。

+0

Doctrine 2のアプローチを見てみたいかもしれません。 http://docs.doctrine-project.org/en/latest/index.html基本的に、Personは普通の古いビジネスオブジェクトになります。データベース永続性は独立しています。 – Cerad

答えて

3

複数のパターンがあります。私は自分自身MVC patternを使用するのが好きです。 MVCは約splitting user interface interaction into three distinct rolesです。しかし、他のパターンがありますが、わかりやすくするために(私はMVCにしか入っていません)。 SOLID principlesを使用している限り、どのパターンを従いたいかは実際問題ではありません。

私はC#.NETのバックグラウンドに由来しているので、懸念の分離のアイデアは私には新しいものではありません。

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

明らかに、これは私が取り組まなければならないものと同じ大きさのアプリケーションにとってはあまり役に立ちません。

M odel: 'すべての仕事'
V IEWを行い、我々はあなたが持っているでしょうMVCパターンでは:-)


同意すること

うれしいです:プレゼンテーションの世話人
ontroller:リクエストを処理する

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

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

PHP緩いタイピングはかなり甘い(あなたは何をしているかを知っていれば)と同じであることを行う方法で、私に問題が発生していることをすでに気づいた

時間は吸うことができます。あなたは常に3つの=兆候使用して、厳密な比較を行うことができますことを覚えておいてください。また、何のメソッドのオーバーロードはしない本当に支援方法のオーバーロード確かに全く新しい

PHPではありませんが、

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

をそれ模倣することができます。次のことを考えてみましょう:

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

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

もう一つの方法は、to do次のようになります。

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 chat明日にアイドリングを見つけることができ、それ以上の質問がありましたら。

0

これは良い方法ですか?

理想的な方法はありません。決定された状況のために良いと悪いがあります。

入力については、PHPはそれを緩めません。その動的タイピングと呼んでいます。

このアーキテクチャについては、エンタープライズレベルのWebアプリケーションを中規模から大規模に開発するときに、毎日パフォーマンスについて話す傾向があります。

開始するには良い点が、最も知られているPHPフレームワークの一部について読んされるだろう、のような:

  • Zendの
  • symfonyの
  • Kohanaの

あなたは考え始めることができるから、建築について

+1

http://programmers.stackexchange.com/questions/143178/which-open-source-php-project-has-the-perfect-oop-design-i-can-learn-from/143192#143192 – PeeHaa

関連する問題