2009-08-22 12 views
0

私は特定のサイトにしか関係しないCOREクラスを持っています。つまり、サイト固有の機能を実行します。私はデータベースクラス(mysql用)、およびアクセス、バリデーター、アップロード、テンプレートなどのような他のクラスを持っています...私はPHPクラスはそれぞれ1つのクラスを拡張できることを知っているので、ほとんどすべてのクラスがデータベースクラスを拡張します。私はtwitter APIで使われている公開Twitterクラスを探していました。その中には、Webサイトに直接行ったり、挿入したり、削除したりすることができるほとんどすべてを行う機能があります。私のCoreクラスにすべてのサイト関連関数を入れて、スクリプトの一般的な範囲。今私は、相続人はこのような何か....サイトのPHPサイトには一般的なクラスが必要ですか?

例を持っている今、私はその関数内

$core = new Core(); 
$core->get_user_info($user_id); 
$core->get_user_articles($user_id); 

のような機能を持っているのように、私はいけないので、必要な情報を選択するために、データベースクエリを実行しますそれは乱雑になる可能性があるので直接それをしなければならない。

はまた、私は挿入する機能を持っていけない、しかし

$core->Delete_Article($article_id); 

のように、物事を削除する機能を持っています。代わりに、データベースクラスを直接使用して情報を追加します。

$article = array(user_id => $_SESSION['user_id'], body => $_POST['body']); 
$db = new Database(); 
$db->Insert($article, 'articles'); 

または今

$user = array(name => $_POST['name'], email => $_POST['email']); 
$db->Insert($user, 'users'); 

は、別の一の態様の分離のトピックで、私は私のデータベースのすべてが/ /挿入/更新を選択し、私の一般的なCOREクラス内のクエリを削除してください置く必要がありますすべてのデータベースアクションをバックグラウンドで処理します

$ db-> Insert()の代わりに、$ core-> insert_user()を使用するか、そのままやり続けます。

答えて

2

これは、オブジェクト指向プログラミングの新しい人にとってはよくある間違いです。必要な機能がいくつかあるだけなので、クラスを拡張する必要はありません。実際、あなたが始めている間は、クラスの拡張を避けたいかもしれません。 OOPへのほとんどのイントロは大きな財産を得ていますが、私は現時点ではっきりと指摘しています。

代わりに、使用方法によって機能をグループ化する方法について考えてみましょう。たとえば、ユーザーを管理しているとします。

class User { 
    function getName()... 
    function getID()... 
} 
class UserAdmin { 
    function addUser(User $user)... 
    function getUser($id)... 
    function deleteUser($id)... 
} 

これらのクラスは、あなたが呼び出すために必要な機能内容に応じていない、概念に基づいて編成されています。あなたはこのようなクラスを作成することができますなど、それらを削除し、ユーザーを追加、ユーザー情報を追跡する必要があります。

する場合には、データベースアクセスなどの機能を再利用する必要があります。通常、別のオブジェクトが必要です。だからではなく、あなたのUSERADMINクラスを有していると、そのSQLフォーマットするにDatabaseクラスを拡張します...

// wrong 
class UserAdmin extends Database { 
    function getUser($id) { 
    $this->openConnection(); 
    $this->runQuery("select * from users where id = {1}", $id); 
    } 
} 

をすることができますだけで使用あなたUSERADMINクラス内からDatabaseクラス:

// right 
class UserAdmin { 
    function getUser($id) { 
    $db = new Database(); 
    $db->openConnection(); 
    $db->runQuery("select * from users where id = {1}", $id); 
    } 
} 
class Database { 
    function openConnection() ... 
    function runQuery() ... 
} 

当初はより多くの作業のように見えますが、さまざまなクラスを独立させています。これにより、書き込み、保守、テストが容易になります。

0

PHPはすべてのページビューですべてをリロードしているので、私はすべてのクラスをインスタンス化するのにはあまり効果がありません。機能をデータベーススキーマにほぼ対応するファイルに分割すると、各ページヒットで読み込まれる機能を増やすことなく、スケールアップして上げることができます。

数十から数百のテーブル/クラスがある場合は重要です。

は、具体的にPHPのために、我々はこのスタイルを好む:さらに一歩それを取るために

class Member 
{ 
    public static function Insert($aData) 
    { 
     //Insert member and return ID 
    } 
    public static function Select($Member_ID) 
    { 
     //select member and return Array 
    } 

    public static function List($aFilter) 
    { 
     //Return list of members filtered by specific criteria 
    } 
} 

を、我々は、関連する「singletonish」変数を保持している静的クラスAppを持っています。

class App 
{ 
    public static $DB = NULL; 
} 

App::$DB = new Connection(); 

は今、どこでもあなたのアプリで、あなたが言うことができます。

App::$DB->Query(...); 
0

一般的に、私は何をすべきかだけでSQLが引数である取る私のデータベースクラスに単純なクエリ()メソッドを追加することです。次に、私はすべての一般的なCRUDメソッドを特定のクラスに抽象化します。したがって、Articleクラスがある場合、deleteArticle()メソッドはそのクラスに入り、Articleクラスをデータベースクラスで拡張します。そのクラス内で$ db-> query($ sql)を使用してください。あなたの他のクラスと一緒に...

関連する問題