5

基本的に、1 つのクラス (この場合はクラス A) が別のクラス (この場合はクラス B) で関数を実行して、データベースから情報を取得する 2 つのクラスを作成しています。

ただし、B_runtime()実際にデータベースを呼び出すと、エラーが発生しますCannot access protected property A::$db

私が理解していない__constructのは、両方のクラスに 2 つあるにもかかわらず、PDO ステートメントがクラス A からのデータベース接続を使用して非常に永続的であるということです。

B_runtime()これは、クラスAの外部から呼び出すと発生しないため、クラスA内から実行しているという事実と関係があると確信しています.

クラス A をパブリック変数に簡単に変更できることはわかっていprotected $db;ますが、これを修正する方法については非常に興味があります。

ob_start();
include('/config.php');
ob_end_clean();

$A = new A($db);
$B = new B($db);

echo $A->A_runtime();

class A{
    protected $db;
    public function __construct($db){
       $this->db = $db;
    }
    public function A_runtime(){
        return B::B_runtime();      
    }
}

class B{
    protected $db;
    public function __construct($db){
       $this->db = $db;
    }
    public function B_runtime(){
        $preparedStatement = $this->db->prepare('SELECT * FROM z_mod_html WHERE ModuleLink = :moduleid LIMIT 1');
        $preparedStatement->execute(array(':moduleid' => '1'));
        $rows = $preparedStatement->fetchAll();
        return $rows[0]['HTML'];
    }
}

長いコードで申し訳ありません - アイデアや提案があれば、大歓迎です。ありがとう。

4

2 に答える 2

3

おい。

まず、非静的メソッドを静的メソッドとして呼び出しています。

B::B_runtime();

B_runtime が静的メソッドとして宣言されている場合にのみ、この方法で使用する必要があります

static public function B_runtime(){

第二に、あなたのクラスには、一般的に良くないと考えられる外部依存関係があります。クラスは、グローバルではなく、与えられたものにのみ依存する必要があります。これは、依存性逆転の原則と呼ばれます。クラスが何かに依存している場合は、引数を介してこの依存関係を与える必要があります。さらに良いのは、タイプヒントを使用して、依存関係に期待するメソッドがあることを確認することです。

public function A_runtime(B $object_b){

これをさらに一歩進めるには、具体的なクラスの代わりに、型ヒントに抽象またはインターフェイスも使用する必要があります。このようにして、必要になった場合に B を別のバージョンの B に切り替えることができます。

interface BInterface {
   public function B_runtime();
}

それから

public function A_runtime(BInterface $object_b){

OO 設計の SOLID 原則を読んでください。

http://en.wikipedia.org/wiki/SOLID_(オブジェクト指向デザイン)

于 2012-04-06T17:09:11.477 に答える
3

B のインスタンスをメソッドに渡すことができます。このようにして、クラス B に対するメソッドの依存関係も定義します。

$A = new A($db);
$B = new B($db);

echo $A->A_runtime($B);

class A{
    //...
    public function A_runtime($instance){
        return $instance -> B_runtime();      
    }
}

クラス B のインスタンスが期待されていることを知らせるために、PHP 5 で型ヒントを使用することもできます。

    public function A_runtime(B $instance){
于 2012-04-06T16:58:50.143 に答える