0

私はDBhelperというクラスを持っていて、今度はUserManagerという新しいクラスを作成しました。UserManagerにGetUserId()やCheckValidation()などの関数が必要です。したがって、これらのデータベースアクションにはDBhelperが必要です。しかし、私はそれがこのように機能しないことを発見しました:

require_once('DBhelper.php');
class User{
  public $databaseHelper = new DBhelper();//syntax error
  public $DB = $databaseHelper->connectDB();//syntax error

  public function GetUserId(){
    $this->databasesHelper->RunSql();//syntax error
    ...
  }
  public function CheckValidation(){
    $this->databasesHelper->RunSql();//syntax error
    ...
  }
}

私を半分にしてください、私は長い間インターネットを検索してきました。ありがとう。

4

5 に答える 5

8

このようなものを試してください。依存性注入のデザインパターンを使用しています。

class User {
    private $db;
    public function __construct(DBHelper $db) {
         $this->db = $db->connectDB();
    }

    public function GetUserId(){
        $this->db->RunSql();
    }

}

これをインスタンス化する方法は次のとおりです。

// Assuming: require( 'DBhelper.php');
$dbh = new DBHelper();
$user = new User( $dbh);

また、エラーに触れると、これらはエラーです(構文的に正しいため、構文エラーではないことに注意してください)。

public $databaseHelper = new DBhelper();//syntax error
public $DB = $databaseHelper->connectDB();//syntax error

メンバー変数を非静的値に初期化できないためです。したがって、コンパイル時に値がわからないため、エラーになります。

同様に、これらの呼び出し:

$this->databasesHelper->RunSql();//syntax error

$databasesHelper適切なオブジェクトでインスタンス化されなかったため、無効です。

于 2012-06-15T14:20:38.817 に答える
2

コンストラクターまたはその他の適切なメソッドでインスタンス変数をインスタンス化する必要があります。これまでのように、インスタンス変数を宣言してインスタンス化することはできません。

コードは次のようになります。

require_once('DBhelper.php');
class User{
  public $databaseHelper;
  public $DB;

  public function User(){
    $this->databaseHelper = new DBHelper();
    $this->DB = $this->databaseHelper->connectDB();
  }
  public function GetUserId(){
    $this->databaseHelper->RunSql();//syntax error
    ...
  }
  public function CheckValidation(){
    $this->databaseHelper->RunSql();//syntax error
    ...
  }
}
于 2012-06-15T14:22:10.860 に答える
1

データベースクラスをクラスの外部に公開したくない場合は、コンストラクターでインスタンス化できます。より良いイベントとして、それらをコンストラクターに渡すことができるので、Userクラスはそれらをインスタンス化する方法を知る必要さえありません-食物連鎖の上位の何かがそれらの作成を処理できます(特に、後でUserのような別のクラスが必要な場合)彼ら)。

class User{
  private $databaseHelper;
  private $DB;

  public function __construct() {
      $this->databaseHelper = new DBhelper();
      $DB = $databaseHelper->connectDB();
  }

  public function GetUserId(){
    $this->databasesHelper->RunSql();
    ...
  }
  public function CheckValidation(){
    $this->databasesHelper->RunSql();
    ...
  }
}
于 2012-06-15T14:22:13.560 に答える
1

そのような価値を不動産に割り当てることはできません。
コンストラクターを作成し、そこにデフォルト値を割り当てます

于 2012-06-15T14:22:41.117 に答える
1

私もあなたと同じことをしました。しかし、私は自分のdbクラスを次のように宣言しました。

public class MySqlDatabase
{

private static $connection;

public static function openConnection()
{
    self::$connection = mysql_connect(DB_SERVER, DB_USER, DB_PASS);
    if(!self::$connection)
    {
        throw new Exception("Connection failed to database");
    }

    mysql_select_db(DB_NAME, self::$connection);
}


public static function closeConnection()
{
    if(isset(self::$connection))
    {
        mysql_close(self::$connection);
    }
}

public static function executeQuery($query)
    {
        $result = mysql_query($query, self::$connection);
        if(!$result)
        {
            throw new Exception("Query execution failed. " . $query);
        }

        return $result;
    }
}

そして、私の他のクラスの中で、私はそれらをこのように呼んでいます。

MySqlDatabase::openConnection();
MySqlDatabase::executeQuery();
MySqlDatabase::closeConnection();

つまり、データベース接続ロジックを静的として宣言すると言っています。アクセスするのは簡単です

于 2012-06-15T14:26:19.020 に答える