2015-07-03 2 views
-1

Я работаю над системой управления контентом для моей жены, которая хочет создать сайт, и у меня есть способ, которым я всегда занимался в прошлом, но хочу доставить лучшие процедуры кодирования, так что это моя дилемма.Объявление нового класса() начало класса

Это код, который я использовал в прошлом, который я знаю, работает.

class accounts { 
    public function CheckAccountLogin() { 
     global $db; 
     $query = <<<SQL 
     SELECT id,gaToken 
     FROM accounts 
     WHERE password_hash = :hashedpw 
SQL; 
     $resource = $db->sitedb->prepare($query); 
     try { 
      $resource->execute(array (
      ':hashedpw' => sha1($_POST['user-name'].':'.$_POST['user-pass']), 
      )); 
      if($resource->rowCount() == 0) { echo false;} 
      else { 
      foreach($resource as $row) { 
      $this->authkey = $row['gaToken']; 
      if($this->authkey == "") { 
       self::SetSession(); 
       } 
       else { 
        self::CheckAuth(); 
       } 
      } 
     } 
     catch(PDOException $e) { 
      echo $e->getMessage(); 
     } 

    } 
} 

Теперь каждая функция должна global $db в начале функции для того, чтобы использовать $db->sitedb или иначе мы бы об ошибке бросили наш путь, так что я хочу сделать вместо этого

class accounts { 
    public $db = new db(); 
    public function CheckAccountLogin() { 
     $query = <<<SQL 
     SELECT id,gaToken 
     FROM accounts 
     WHERE password_hash = :hashedpw 
SQL; 
     $resource = $this->sitedb->prepare($query); 
     try { 
      $resource->execute(array (
      ':hashedpw' => sha1($_POST['user-name'].':'.$_POST['user-pass']), 
      )); 
      if($resource->rowCount() == 0) { echo false;} 
      else { 
      foreach($resource as $row) { 
      $this->authkey = $row['gaToken']; 
      if($this->authkey == "") { 
       self::SetSession(); 
       } 
       else { 
        self::CheckAuth(); 
       } 
      } 
     } 
     catch(PDOException $e) { 
      echo $e->getMessage(); 
     } 

    } 
} 

Таким образом, во всех моих новых функциях я могу просто объявить $this->sitedb всякий раз, когда мне нужно подключиться к базе данных. С приведенным выше кодом мне дают Parse error: syntax error, unexpected 'new' (T_NEW) in /var/www/html/functions.d/accounts.class.php on line 3. Я знаю, где проблема, я просто ищу более чистый способ, чем мой первый блок кода. Любая помощь в том, чтобы это правильно работало, будет очень признательна.

+2

использовать инъекцию зависимостей или сделать класс модели одноэлементного –

ответ

2

Вы не можете инициализировать переменную там, если она не может быть оценена во время компиляции. Поэтому вы не можете позвонить new. См. docs. Сделайте это в конструкторе.

class accounts { 
    public $db; 

    public function __construct() { 
     $this->db = new db(); 
    } 
} 
+0

Это действительно отлично работает, я никогда не думал об использовании конструкции в каждом классе, я думаю, что могу использовать его для очистки многих вещей, которые у меня были. Например, функция построения, которая автоматически включается в качестве подкласса и создает экземпляры всех классов. Благодарю. –

+2

Возможно, более разумно использовать защищенную переменную для чего-то вроде баз данных, поэтому ее нельзя изменить вне класса – Bankzilla

+0

Хорошая точка. Я попытался сделать мой код как можно более похожим на оригинальный пример, так что было бы легко увидеть, как он работает. – mkasberg

0

Вы можете создать глобальный класс DbConnect, где вы статически определить объект БД базы данных и подключить его к базе данных, таким образом, вы будете держать один объект подключения к базе данных в вашем приложении.

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

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