将静态变量的值分配给类变量

时间:2016-01-18 22:10:40

标签: php

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;,则编译错误消失。但这不正确。 在这种情况下我得到一个运行时错误。 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的默认值?有任何想法

3 个答案:

答案 0 :(得分:3)

在5.6之前,您无法在函数和其他类或非平凡表达式的类中分配变量。您必须使用类中的函数设置变量。

现在在您的终端中键入php -v以查看您正在使用的版本。否则,如果要使用该功能,请将PHP升级到PHP 5.6

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

答案 1 :(得分: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
    }
}

或升级到更高版本的php。

此外,从设计的角度来看,将各种变量硬编码并分散在2个文件上是非常复杂的。理想情况下,将它们全部注入构造函数中:

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

没有将它们全部在config类中声明:

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

答案 2 :(得分: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.
    }
}