【问题标题】:Assigning value of static variable to a class variable将静态变量的值分配给类变量
【发布时间】:2016-01-18 22:10:39
【问题描述】:

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 并将其设为 class DB$server 的默认值?有什么想法请教

【问题讨论】:

标签: php


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    这是 php(版本

    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
    } 
    

    【讨论】:

    • 谢谢史蒂夫,我正在尝试这个
    • @JavaDev 没问题。您还应该研究类自动加载,它的设置非常简单,并且无需在所有地方添加 requireinclude
    • 此外,将各种变量硬编码并分散在 2 个文件中是非常复杂的。理想情况下,将它们全部注入构造函数中,例如 __construct($server, $user, $password, $database){$this->server = $server; $this->user = $user;//etc} 失败,将它们全部声明在配置类中
    • 再次感谢史蒂夫,我尝试了第二种方法并且它有效。不知何故,我觉得不采用第一种注入构造函数的方法,因为这样责任就委托给了调用者。还为类自动加载概念再次 +1 [我不能在 SO 中这样做:)]。
    【解决方案3】:

    你不能使用类外的变量,即使你需要它们在同一个文件中。

    你可以这样做:

    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.
        }
    }
    

    【讨论】:

    • 谢谢,+1,我可以做到这一点并让它工作,但是每次调用构造函数时,是不是每次都有require 'Config.php' 的额外负担?
    • 好吧,每次你在类中包含文件时,你都会加载Config.php...在构造函数中调用它是相同的,但它以这种方式工作。
    • @PhiterFernandes 虽然没有由此产生的不利影响,但在文件顶部添加您的需求也没有任何优势,而且它使读取类依赖项变得更加困难
    • 其他解决方案是将 $dbserver 作为参数传递给构造函数......所以你不需要在构造函数本身内部调用文件,但是在调用类的文件中是的。如果这是你的愿望,我可以用一个例子来编辑这个问题。
    • 感谢@PhiterFernandes 在第一时间提供答案,实际上我现在意识到require 'Config.php'; 不需要包含在构造函数中。它可以是文件中的顶级声明。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-21
    • 1970-01-01
    • 2010-11-13
    • 1970-01-01
    • 2014-01-06
    • 2014-06-04
    相关资源
    最近更新 更多