簡體   English   中英

PHP在多個類中工作

[英]PHP work in multiple classes

我有一個名為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
    ...
  }
}

請阻止我,我已經在互聯網上搜索了很長時間。 謝謝。

嘗試這樣的事情,它使用依賴注入設計模式。

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

您需要在構造函數或其他適當的方法中實例化實例變量。 您不能像完成操作那樣聲明和實例化實例變量。

您的代碼應如下所示:

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
    ...
  }
}

您可能不想在類之外公開數據庫類,而可以在構造函數中實例化它們。 更好的情況是,您可以將它們傳遞給構造函數,這樣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();
    ...
  }
}

您不能像分配屬性那樣分配值。
創建一個構造函數並在那里指定默認值

我也做過像你一樣的事情。 但是我已經聲明了我的數據庫類如下:

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();

因此,我是說將您的數據庫連接邏輯聲明為靜態。 這將比訪問容易

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM