3

私はOOPを初めて使用しますが、最近質問をしました。

  • すべての「操作」は、個別のクラスで実装する必要があります。
  • 私が直面した問題は、依存性注入で解決する必要があります、
  • アプリケーション全体で1つのオブジェクトを使用することはできません。

次のコードがあるとしましょう。

class FtpConnect {
     public $server;

     private function connect () { ... }

     public __construct ($db, $mailer, $server) {
         $this->server = $server;
         $this->connect();
     } 
}

class Database {
    public $database_property;
    ...
}

class Phpmailer {
    public $phpmailer_property;
    ...
}

$db = new Database();
$mail = new Phpmailer();

$ftp = new Ftpconnect ($db, $mail, "ftp.mozilla.org");

$ftp->db->database_property;
$ftp->mail->phpmailer_property;

これは適切なアプローチですか?まだ1つのオブジェクトがあるよう$ftpです。

プロパティを読んだり、次のようなメソッドを呼び出したりする$ftp->db->database_property;のは適切な方法ですか?

4

2 に答える 2

5

あなたの例には、いくつかの良い点といくつかの悪い点があります!まず、優れたプログラミング手法を学ぶための真剣な試みをおめでとうございます。あなたは正しい方向に進んでいます!

良いもの:

  • 適切なコンストラクターインジェクション(DIの形式)を使用しているためnew、サンプルの最高レベルでのみステートメントを記述し、クラス内には記述していません。
  • さまざまなサービスごとにクラスを作成しました。すばらしいです。

悪いこと:

  • ftpインスタンスを介してdbとmailのプロパティにアクセスしているので、そうしないでください。
  • パブリックプロパティを使用し、プロパティをプライベートにし、パブリックゲッターとセッターを使用します
  • コンストラクターでメインメソッドを呼び出していますが、そうしないでください。クラス内ではなく、クラス外で呼び出す必要があります。
  • ftpインスタンスに渡された$mailerインスタンスでは何もしていませんが、ftpクラスには本当にmailerクラスが必要ですか?

改善された例では、ftpクラスが実際にデータベースとメールの両方を必要としていると仮定しています。

class FtpConnect {

     private $db;
     private $mailer;

     private $server;

     public function connect () { ... }

     public __construct ($db, $mailer, $server) {
         $this->setServer($server);
         $this->setMailer($mailer);
         $this->setDb($db);
     }

     public setServer($server)
     {
         $this->server = $server;
     }

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

     public setMailer($mailer)
     {
         $this->mailer = $mailer;
     }
}

class Database {
    private $databaseProperty;
    public getDatabaseProperty()
    {
        return $this->databaseProperty;
    }
}

class Phpmailer {
    private $phpmailerProperty;
    public ... see above...
}

$db = new Database();
$mail = new Phpmailer();

$ftp = new FtpConnect ($db, $mail, "ftp.mozilla.org");
$ftp->connect();

$someProperty = $db->getDatabaseProperty();
于 2012-10-15T12:29:54.900 に答える
0

コンストラクターは、渡された3番目の引数を除くすべてをサイレントに破棄します。なぜftpにdbオブジェクトを置くのですか?それは少し奇妙に見えます。

それ以外の場合は、db / mailオブジェクトの変数をすでに初期化しているので、それらを使用するか(チェーンを少なくするとコードが読みやすくなります)、次のように記述します。コードをわかりにくく$ftp = new Ftpconnect (new Database, new Phpmailer, "ftp.mozilla.org");しないでください。

使用しないものをftpオブジェクトに与えないでください。また、アクセスしようとしているプロパティがインスタンス固有ではない場合(そのクラスのすべてのオブジェクトで同じになる)、クラス定数または静的変数を使用する必要があります

于 2012-10-15T12:28:54.773 に答える