2011-08-13 14 views
4

これは奇妙なことになります。私は、MySQLと独立したクラスのためのデータベースクラスを持っています。たとえば、PHPは異なるクラスランタイムから拡張します(変数として拡張されますか?)

class users extends MySQL 

このクラスは、ユーザーの一般的なクラスであり、使用回数を増やすことができます。 しかし時折、「MySQL_DEBUGGED」クラスが存在し、もしそうなら、私はそれから延長したい:

class users extends MySQL_DEBUGGED 

私が存在する場合MySQL_DEBUGGEDを継承させたい、そうでない場合はMySQLのクラス。それを変数に入れると、エラーが発生します。どうやってするの?

+0

私はあなたに2つの異なるクラス(MYSQLとMYSQL_DEBUGGED)があるのはなぜ分かりますか?私は、問題はあなたが2つのクラスを持っているのではなく、もっと冗長に(つまり:デバッグするために)構成することができる1つのクラスではないということです。 – laurac

+0

あなたは何をしているのですか?デバッグのために、あなたはlogger(すなわち:log4php)を使用して、あなたのニーズに合わせてそれを設定しなければなりません。 – laurac

答えて

1

あなたがする必要があることは、class_exists()機能を使用することです。

if (class_exists('MySQL_DEBUGGED')) { 
    class users extends MySQL_DEBUGGED { 
     .... 
    } 
} else { 
    class users extends MySQL { 
     .... 
    } 
} 

私はそれをお勧めしません。条件付き宣言クラスは悪夢のようです。

+0

thatsですが、すべてのメソッドはコピー/ペーストしなければなりません、避けたいものthat – deeped

4

PHPスクリプトには名前が書かれていないクラスから継承することはできません。


可能な解決策は、次のようになります。

  • あなたusersクラスは常にそれらのいずれかを意味MySQLクラスを(延長する二つの別々のファイル
  • に、二つのクラス、MySQLと呼ば両方を定義します2つ)
  • 状況に応じて、次を含みます。
    • 「生産」MySQLクラスが含まれているファイル、
    • または「開発」MySQLクラス

この方法が含まれているファイルは、あなたのクラスは常にMySQLクラスを拡張 - しかし、あなたは含まれます右のもの


基本的には、あなたのメインのファイルで、あなたが持っていると思います:

if (DEBUG) { 
    require __DIR__ . '/MySQL-debug.php'; 
} 
else { 
    require __DIR__ . '/MySQL-production.php'; 
} 

class users extends MySQL { 
    // ... 
} 

そしてMySQL-debug.phpMySQL-production.phpMySQLというクラスが含まれます両方 - の、両方のファイルで同じものを含んでいないだろうコース。

+0

+1、それを行うより良い方法。 – Brad

+0

これは良く見えますが、MySQL-debugはMySQLプロダクションを継承しています:)クラス名は同じではありません – deeped

+1

@deeped humph、too bad; MySQL-debugとMySQL-productionの両方を持つことは、すべての共通コードを含む共通のMySQL共通クラスを拡張しますか? –

1

最も簡単な解決策は、空の "ブリッジ"クラスを持ち、常にそのクラスから継承することです。

次に、2回宣言する必要がある唯一のクラスは空のクラスです。あなたのページ

if (class_exists('MySQL_DEBUGGED')) { 
    class MySQLBridge extends MySQL { } 
} else { 
    class MySQLBridge extends MySQL_DEBUGGED { } 
} 

class User extends MySQLBridge { 
    // ... your code ... 
} 

そして最後に:

require_once('User.php'); 
$user = new User(); 

他の提案の解決策は、私はお勧めしませんあなたの継承されたクラスの2つのコピーを持っているあなたを必要としています。

関連する問題