2012-06-15 6 views
0

Я hava класс под названием DBhelper, и теперь я создал новый класс UserManager. Мне нужен UserManager, который имеет такие функции, как GetUserId() и CheckValidation(). Поэтому мне требуется DBhelper для этих действий базы данных. Но я нашел, что это не работает следующим образом:PHP работает в нескольких классах

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

Пожалуйста, остановите меня, я долго искал интернет. Благодарю.

+1

У вас есть Google Injection Dependency Injection? –

+0

нет у меня нет. Но я делаю это после того, как вы говорите. Однако это не помогает. Я знаю концепцию инъекции зависимостей, но я не знаю, как применить это в php. Спасибо за ваш комментарий. – panda

ответ

8

Попробуйте что-то вроде этого, оно использует шаблон дизайна dependency injection.

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 никогда не был экземпляр с соответствующим объектом.

+0

, поэтому мне нужно передать весь DBhelper как $ db в _construct? – panda

+0

Да, точно так же, как я сделал в этом примере – nickb

+0

@PandaYang: Вы передаете только идентификатор объекта, а не весь объект в PHP. Объект находится где-то в памяти, и он не уходит. – hakre

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

спасибо, это действительно помогает. – panda

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(); 
    ... 
    } 
} 
+0

В этом случае каждый экземпляр класса (скажем, пользователь класса) создаст новое соединение с базой данных, верно? Это может быть плохо, если у нас есть 5 пользовательских объектов, так как у нас также есть 5 db-соединений. – Sliq

+0

@Panique, если вы хотите использовать одно соединение, вы должны иметь логику в DBhelper для получения существующего соединения, вместо того чтобы позволить классу User решать, использовать ли существующее или новое соединение. – Fenton

1

Вы не можете присвоить такое значение для пробиотиков.
Создайте конструктор и назначьте значение по умолчанию там

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

так, я утверждаю, что заявляю логику подключения к базе данных как статическую. Это будет не так легко получить

Смежные вопросы