2016-01-18 4 views
1

config.phpПрисвоение значения статической переменной в классе переменной

class Config { 
    public static $dbserver = "hostedserverURL"; 
} 

DB.php

require 'Config.php' 
class DB { 

    private $server = Config::$dbserver; // compile-error 
    private $user = "user"; 
    private $password = "password"; 
    private $database = "databasename"; 
    private $db; 
} 

компиляции ошибки говорит "syntax error, unexpected '$dbserver', expecting 'identifier' or 'class'"

Если удалить $ и смените строку на private $server = Config::dbserver;, компилировать Электронная ошибка исчезла. но это неверно. В этом случае я получаю ошибку Runtime. Fatal error: Undefined class constant 'Config::dbserver' in ..

Так что я должен сохранить $, также в соответствии с этой SO теме: Fatal error: Undefined class constant

Это где я использовать ее,

public function __construct() 
    { 
     $this->db = new PDO(
      "mysql:host={$this->server};dbname={$this->database};charset=utf8", 
      $this->user, 
      $this->password 
     ); 
     return $this; 
    } 

Вопрос: Как я могу укажите статическую переменную dbserver и сделайте это значением по умолчанию для $server из class DB? Любые идеи, пожалуйста,

+1

Доступно только от [PHP 5.6] (https: //wiki.php. net/rfc/const_scalar_exprs) для некоторой части – DarkBee

ответ

2

Это PHP (версия < 5.6) ограничение, однако, вы можете просто инициализировать свойства в конструкторе:

class DB 
{ 

    private $server; 
    private $user; 
    private $password; 
    private $database; 
    private $db; 

    public function __construct() 
    { 
     $this->server = Config::$dbserver; // No compile-error 
     $this->user  = "user"; 
     $this->password = "password"; 
     $this->database = "databasename"; 
     $this->db  = new PDO(
      "mysql:host={$this->server};dbname={$this->database};charset=utf8", 
      $this->user, 
      $this->password 
     ); 
     //return $this; no need for this 
    } 
} 

Или обновите версию (5.6+) php.

Кроме того, с точки зрения дизайна, имеющие различные переменные, жестко закодированные и разбросанные по 2 файлам, сложны. В идеале у них все впрыскивается в конструкторе:

public function__construct($server, $user, $password, $database) 
{ 
    $this->server = $server; 
    $this->user = $user; 
    //etc 
} 

недостаток, что у них все объявленные в классе конфигурации:

public function__construct() 
{ 
    $this->server = Config::$server; 
    $this->user = Config::$user; 
    //etc 
} 
+0

Спасибо, Стив, сейчас я пытаюсь это сделать – spiderman

+0

@JavaDev Нет проблем. Вы также должны заглянуть в автозагрузку классов, его очень просто настроить и устранить необходимость добавления 'require' или' include' повсюду. – Steve

+0

Кроме того, наличие различных переменных, жестко закодированных и разбросанных по 2 файлам, затруднено. В идеале, все они будут введены в конструктор, например '__construct ($ server, $ user, $ password, $ database) {$ this-> server = $ server; $ this-> user = $ user; // etc} ', если они все объявлены в классе конфигурации – Steve

1

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

Вы можете сделать это:

class DB { 
    private $server; 
    private $user = "user"; 
    private $password = "password"; 
    private $database = "databasename"; 
    private $db; 

    public function __construct(){ 
     require 'Config.php'; 
     $this->server = Config::$dbserver; //Will set the $server variable of the instantiated class. 
    } 
} 
+0

Спасибо, +1, я могу сделать это и заставить его работать, но каждый раз, когда вызывается конструктор, нет ли дополнительного бремени 'require 'Config.php'' everytime? – spiderman

+0

Ну каждый раз, когда вы включаете файл с классом, который вы загрузили 'Config.php' в любом случае ... Вызов его в конструкторе такой же, но таким образом он работает. – Phiter

+0

@PhiterFernandes, в то время как нет никаких неблагоприятных эффектов от этого, нет также преимущества перед добавлением вашего требования в верхней части файла, плюс это затрудняет чтение зависимых от классов. – Steve

3

Вы не можете назначить переменные в классах от функций и других классов или нетривиальных выражений до 5.6. Вам нужно будет установить переменную с помощью функции внутри класса.

На данный момент введите php -v в свой терминал, чтобы узнать, какую версию вы используете. В противном случае, если вы хотите использовать эту функциональность, обновить PHP до PHP 5,6

https://wiki.php.net/rfc/const_scalar_exprs

+0

Спасибо @DataHerder – spiderman

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