私は最近、既存の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週間ほど掘り下げていましたが、役に立たなかったのです。私が見つけたのは、構造標準ではなく構文標準だけです。
前もって感謝します。