0

おそらくばかげた質問ですが、このテンプレートを使用して PHP に多くのクラスがあります。

class SomeTable {
    private $db;
    private $prefix;
    private $tbl_name;

    function __construct($db, $tbl_name) {
            $this->db = $db;
            $this->prefix = $db->tblPrefix();
            $this->tbl_name = $tbl_name;
            $this->install();
    }

    private function install() {
        $sql = "CREATE TABLE IF NOT EXISTS...";
        $this->db->query($sql, null);
    }

    // query functions
    ...
}
  • データベース内の各テーブルを表すこれらのクラスの 1 つがあります。
  • 上部の 3 つのプライベート変数は、各クラスで使用できる必要があり、コンストラクターで設定されます。
  • コンストラクターは、すべてのクラスで同じです。
  • データベーステーブルの作成に使用されるため、install()関数はクラスごとに異なります。(クエリを作成/編集している間も見返すことができるので、ここに残しておくのが好きです)。

次に、3 つの変数、コンストラクター、空の install() 関数を使用して抽象クラスを作成し、各クラスに実装しますか? それは私にも同じように機能しますか?

ばかげた質問で申し訳ありませんが、PHP でクラス/継承を使用したことがありません。

4

2 に答える 2

1

クラスを拡張すると、親クラスに存在するパブリック メソッドまたはプロテクト メソッドが継承されます。したがって、次のようなクラスがある場合:

class Database {

    public function get_database(){
        return 'blah';
    }

}

そして、次のようにクラスを拡張します。

class Blah extends Database {
    ...
}

これで、Blah クラスはメソッドを継承するため、とのget_database()両方が同じものを返します。特別な名前を使用して、拡張クラスをターゲットにすることもできます。注: プライベート メソッドは、それらがインスタンス化され、継承されていないクラスでのみ使用できます。Database::get_database()Blah::get_database()parent::

また、子クラスで同じメソッド名を使用してメソッドをオーバーライドできることにも注意してください。したがってget_database()、Blah クラス内にメソッドを記述すると、同じ名前の親のメソッドよりも優先されます。

于 2013-08-27T21:37:58.337 に答える
1

次に、3 つの変数、コンストラクター、空の install() 関数を使用して抽象クラスを作成し、それを各クラスに実装しますか? それは私にも同じように機能しますか?

はい。3 つの変数は、子クラスからアクセスする必要があるためprotected、 ではなく、今すぐにする必要があります。privateこのようなもの:

abstract class DBTable{
    protected $db;
    protected $prefix;
    protected $tbl_name;

    function __construct($db, $tbl_name) {
            $this->db = $db;
            $this->prefix = $db->tblPrefix();
            $this->tbl_name = $tbl_name;
    }

    abstract function install();
}

class SomeTable extends DBTable {
    private function install() {
        $sql = "CREATE TABLE IF NOT EXISTS...";
        $this->db->query($sql, null);
    }

}
于 2013-08-27T21:41:51.850 に答える