1

クラスの __construct() メソッドは、別のクラス内でこのクラスの静的メソッドを呼び出すためにパブリックである必要がありますか?

Database クラスの静的メソッドを呼び出して、Model クラス (MVC アプリ) 内で Database インスタンスを取得しようとしています。この Database クラスのコンストラクターは、シングルトン パターンを持つためにプライベートです。しかし、Model クラス内で静的メソッドを呼び出そうとすると干渉しているようです。

Database コンストラクターを public に設定すると、機能します。しかし、それはもはやシングルトン パターンではありません。

助言がありますか?

データベース クラス:

class Database extends PDO {

    private static $instance;
    private $dsn;
    private $user;
    private $pass;

    public function __construct() {
        $this->dsn  = DB_ENGINE .':host='. DB_HOST .';dbname='. DB_NAME;
        $this->user = DB_USER;
        $this->pass = DB_PASS;
        parent::__construct($this->dsn, $this->user, $this->pass);
    }

    public static function getInstance()
    {
        if (!isset(self::$instance)) {
            $object = __CLASS__;
            self::$instance = new $object;
        }
        return self::$instance;
    }

    /**
     * select
     * @param string $sql An SQL string
     * @param array $array Paramters to bind
     * @param constant $fetchMode A PDO Fetch mode
     * @return mixed
     */
    public function select($sql, $fetchMode = PDO::FETCH_ASSOC, $array = array())
    {
        $stmt = $this->prepare($sql);
        foreach ($array as $key => $value) {
            $stmt->bindValue("$key", $value);
        }

        $stmt->execute();
        return $stmt->fetchAll($fetchMode);
    }

    /**
     * insert
     * @param string $table A name of table to insert into
     * @param string $data An associative array
     */
    public function insert($table, $data)
    {
        ksort($data);

        $fieldNames = implode(', ', array_keys($data));
        $fieldValues = ':' . implode(', :', array_keys($data));

        $stmt = $this->prepare("INSERT INTO $table ($fieldNames) VALUES ($fieldValues)");

        foreach ($data as $key => $value) {
            $stmt->bindValue(":$key", $value);
        }

        $stmt->execute();
    }

    /**
     * update
     * @param string $table A name of table to insert into
     * @param string $data An associative array
     * @param string $where the WHERE query part
     */
    public function update($table, $data, $where)
    {
        ksort($data);

        $fieldDetails = NULL;
        foreach ($data as $key=> $value) {
            $fieldDetails .= "$key=:$key,";
        }
        $fieldDetails = rtrim($fieldDetails, ',');

        $stmt = $this->prepare("UPDATE $table SET $fieldDetails WHERE $where");

        foreach ($data as $key => $value) {
            $stmt->bindValue(":$key", $value);
        }

        $stmt->execute();
    }

    /**
     * delete
     * 
     * @param string $table
     * @param string $where
     * @param integer $limit
     * @return integer Affected Rows
     */
    public function delete($table, $where, $limit = 1)
    {
        return $this->exec("DELETE FROM $table WHERE $where LIMIT $limit");
    }

}

モデルクラス:

class Model {

    protected $db;

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

}
4

0 に答える 0