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
的默认值?有任何想法
答案 0 :(得分:3)
在5.6之前,您无法在函数和其他类或非平凡表达式的类中分配变量。您必须使用类中的函数设置变量。
现在在您的终端中键入php -v
以查看您正在使用的版本。否则,如果要使用该功能,请将PHP升级到PHP 5.6
答案 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.
}
}