2016-09-06 1 views
-1

настоящего времени у меня следующий код:Установить класс статического свойство с помощью конструкции

class User { 
    private static $_db; 

    public function __construct() { 
     self::$_db = Database::getInstance()->getConnection(); 
    } 

    public static function addUser ($name, $username, $password) { 
     // Define Values 
     $name = ucwords(trim($name)); 
     $username = strtolower(trim($username)); 
     $password = password_hash($password, PASSWORD_BCRYPT); 

     // Define Query 
     $query = "INSERT INTO `users` (name, username, password) VALUES(:name, :username, :password)"; 

     // Prepare Query 
     $preparedQuery = self::$_db->prepare($query); 

     // Execute Query 
     $preparedQuery->execute([ 
      ':name' => $name, 
      ':username' => $username, 
      ':password' => $password 
     ]); 
    } 
} 

Я пытаюсь установить свойство класса с моим подключением к базе данных через конструкцию. Проблема в том, что я хочу иметь доступ к методу addUser() в любом месте сценария, просто позвонив User::addUser(). Есть ли способ установить статическое свойство через конструкцию или есть лучший способ обратиться к моей базе данных?

+0

Зачем использовать конструктор для установки статического состояния? – tkausl

+0

Почему вы хотите, чтобы '$ _db' был статичным, из любопытства? – Blake

+0

В настоящее время для доступа к моей базе данных я должен повторить следующую строку в каждом методе, который должен получить к ней доступ или передать ее в аргументах: '$ db = Database :: getInstance() -> getConnection();'. Я считаю, что было бы лучше иметь классную доступную переменную, которую я могу использовать вместо того, чтобы повторять себя на всем протяжении. –

ответ

0

Конструкция вызывается только при создании нового экземпляра класса. Поскольку addUser() является статическим методом, и, следовательно, новый экземпляр не создан, ваш конструктор не будет вызван, а статическая переменная $_db никогда не будет инициализирована.

Я бы добавил создание статического метода, который возвращает соединение с db, и вы можете использовать это везде во всем своем коде. Например:

class User { 

private static $_db; 

public function __construct() { 
    // construct 
} 

public static function getDB() { 
    return Database::getInstance()->getConnection(); 
} 

public static function addUser ($name, $username, $password) { 
    // Define Values 
    $name = ucwords(trim($name)); 
    $username = strtolower(trim($username)); 
    $password = password_hash($password, PASSWORD_BCRYPT); 

    // Define Query 
    $query = "INSERT INTO `users` (name, username, password) VALUES(:name, :username, :password)"; 

    // Prepare Query 
    $preparedQuery = self::getDB()->prepare($query); 

    // Execute Query 
    $preparedQuery->execute([ 
     ':name' => $name, 
     ':username' => $username, 
     ':password' => $password 
    ]); 
} 
} 

Если вы хотите продолжить использовать статическое свойство, вы можете создать статический метод установки для свойства (Вы должны были бы вызвать этот метод, по крайней мере один раз перед вызовом addUser):

public static function setDB() { 
    self::$_db = Database::getInstance()->getConnection(); 
} 
+0

Это похоже на довольно хороший метод, который может работать. Для нестатических методов я просто назову конструкцию на них и задаю 'private $ _db' –

+0

. Вы можете адаптировать код к вашим потребностям. Имейте в виду, что нестатические методы все еще могут использовать 'self :: getDB()', поэтому нет необходимости дублировать код. – Andriko13

+0

По существу статические методы могут ссылаться только на статические методы и свойства, нестатические методы могут по-прежнему обращаться к статическим методам и свойствам? –

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