5

私は OOP の初心者で、FTP サーバーに接続するための PHP クラスを作成しようとしています。

class ftpConnect {
  private $server;
  private $user;
  private $password;

  private $connection_id;
  private $connection_correct = false;

  public function __construct($server, $user = "anonymous", $password = "anonymous@mail.com") {

    $this->server   = $server;
    $this->user     = $user;
    $this->password = $password;

    $this->connection_id      = ftp_connect($this->server);
    $this->connection_correct = ftp_login($this->connection_id, $this->user, $this->password);

    if ( (!$this->connection_id) || (!$this->connection_correct) ){
        echo "Error! Couldn't connect to $this->server";
        var_dump($this->connection_id);
        var_dump($this->connection_correct);
        return false;
    } else {
        echo "Successfully connected to $this->server, user: $this->user";
        $this->connection_correct = true;
        return true;
    }
  }
}

現時点では、クラスの体は取るに足らないものだと思います。

主な問題は、OOP の考え方を理解するのに問題があることです。

コードが実行されるたびに送信メールを追加したかったのです。PHPMailer クラスをダウンロードし、それを使用してクラスを拡張しました。

class ftpConnect extends PHPMailer {...}

いくつかの変数とメソッドを追加しましたが、その時点まではすべてが期待どおりに機能します。

私は考えました:データベースにすべてを保存することを追加しないのはなぜですか。ユーザーが上記のコードを実行するたびに、適切な情報をデータベースに保存する必要があります。

私を編集ftpConnect classして、コンストラクターに接続するデータベースを追加したり、テーブルを更新する他の方法を追加したりできます。しかし、データベース接続とそのすべてが将来他のクラスで使用される可能性があるため、別のクラスで実装する必要があります。しかし、私の「メイン」ftpConnect classはすでに1つのクラスを拡張しており、もう1つも拡張できませんでした。

どうすればこの問題を解決できるかわかりません。多分私ftpConnect classは複雑すぎて、どういうわけかそれをいくつかの小さなクラスに分割する必要がありますか? どんな助けでも大歓迎です。

4

2 に答える 2

8

まず、クラスに設計上の欠陥があると思います。あなたのコンストラクターは仕事をしています。これは、コンストラクターが適切な OOP で行うべきことではありません。コンストラクターはプロパティを設定するだけで、別のメソッドが必要ですconnect()

SecondftpConnectは絶対に拡張しないでくださいPHPMailer。それらは2つのまったく異なるものです。SOLID 原則の一部であるLiskov 置換原則について読んでください。

クラスがデータベースで何かをする必要がある場合、またはメールを送信する必要がある場合は、それらのインスタンスを拡張するのではなく、クラスに注入する必要があります。これは依存性注入と呼ばれ、モック メーラー クラスまたはモック データベース クラスを簡単に使用できるため、後で単体テストを実行しやすくなります。

メールを送信し、データベースにアクセスし、FTP を使用する場合は、少なくとも 3 つの異なる (分離された) クラスが必要です (おそらく、データベースなどのマッピングを行うにはさらに多くのクラスが必要です)。基本的に、すべてのクラスには 1 つの責任があり、1 つだけが必要です。これを単一責任原則といいます。

一般的な参考文献については、次を参照してください。

于 2012-10-13T21:50:37.927 に答える
0

それはおそらく継承よりも構成の問題です。これを参照してください継承よりも 構成を優先しますか? クラス内でメーラーオブジェクトを使用するだけで、クラスがそれらを拡張するのではなく、DBにも同じことが言えます。

class my_class
{
    private $mailer;

    public function __constructor()
    {
         $this->mailer = new Mailer();
    }
}
于 2012-10-13T21:44:39.000 に答える