1

これについていくつか質問があったことは知っていますが、より「具体的な」例
と解決策が必要です。

これが私の例です:
databse.class.php

class db{ 
   public function connect($conStr){...} 
} 

func.class.php

func class{ 
   public insert_song(){ 
      //ineed to use the conenct method from database 
      //then I would INERT INTO... 
   } 
}

質問:
1) func クラスで db クラスを要求または拡張する必要がありますか?
2) 必要に応じて、db クラス関数の範囲は残りますか? (私がそこにプライベート変数を持っているとしましょう。それは外側からアクセスできますか?)

4

3 に答える 3

5
  • いいえ、データベースクラスを要求または拡張しないでください。
  • いいえ、プライベート変数またはメソッドがクラス外で使用可能になることはありません。保護された変数は子クラスでのみ使用でき、パブリック変数は...publicです。

構成内のどこかにデータベースクラスが存在するファイルが必要になる可能性があるため、いつでもどこでもデータベースクラスをインスタンス化できます。ただし、データベースオブジェクトのインスタンスはおそらく1つしか必要ないため、構成でインスタンス化し、依存性注入を使用して渡すことができます。

これは基本的に、データベースオブジェクトを必要とする他のオブジェクトに渡すことを意味します。データベースオブジェクトを処理する一般的な方法は、コンストラクターインジェクションを使用することですが、セッターインジェクションも同様に使用できます。

あなたがすることはこれに似たものです:

// config:
$db = new Database;
$db->setConnectionValues();

$fooClass = new Foo($db);
$fooClass->insertSomething();

// fooClass:
class Foo
{
    private $db;

    public function __construct(Database $db)
    {
        $this->db = $db;
    }

    public function insertSomething()
    {
        $this->db->query("INSERT");
    }
}

これにより、依存関係の問題のほとんどが解決されます。

于 2012-07-11T08:01:53.767 に答える
3
// changed the class name, func is not good for a class name.
class Foo {
   protected $db;

   public setDb($db) {
     $this->db = $db;
   }

   public insert_song(){ 
      //ineed to use the conenct method from database 
      //then I would INERT INTO...
      $this->db->insert(...); 
   } 
}

例:

// omited the error handling.
$db = new db();
$db->connect();
$foo = new Foo();
$foo->setDb($db);
$foo->insert_songs();
于 2012-07-11T07:58:38.670 に答える
2

抽象化の一環として、クラスの責任を分離する必要があります。あなたのDatabaseクラスはあなたのSongs(あなたがそれをどのように名付けるべきかということです)クラスを気にかけるべきです。

Songsクラスでクラスを使用する場合は、次のようにコンストラクターに挿入Databaseする必要があります。

<?php

class Database {
    public function connect($conStr) {
        /*
         * Connect to database here
         */
    }
}

class Songs {
    private $db;
    public function __construct(Database $db) {
        $this->db = $db;
    }

    public function insert_song($song) {
        /*
         * Now you can use $this->db as your database object!
         */
    }
}
于 2012-07-11T08:01:41.227 に答える