【问题标题】:PHP - value from variable to constantPHP - 从变量到常量的值
【发布时间】:2012-07-09 14:18:50
【问题描述】:

我正在学习 PHP 中的 OOP,我想将值从变量放入类常量。我该怎么做?

这是我的代码(不工作!):

class Dir {

const ROOT = $_SERVER['DOCUMENT_ROOT']."project/";

function __construct() {

}
}

有什么解决方案,如何从变量中获取值,添加字符串并将其放入常量 - 在 OOP 中?

【问题讨论】:

  • 1:您遇到了什么错误。 2:您尝试过什么 3:为什么要在类级别定义常量,而显然它是属于全局级别的常量 3:尝试将根更改为 PROJECT_ROOT,因为 ROOT 是一个危险的常量定义(太接近环境变量,如果你问我)
  • 请注意,不建议在类中使用全局常量。当你想重用你的类但不需要全局范围内的任何常量时会发生什么?对此类数据使用 Getter 和 Setter。

标签: php oop variables constants


【解决方案1】:

从手册页http://www.php.net/manual/en/language.oop5.constants.php 你可以发现:

The value must be a constant expression, not (for example) a variable, a property, a result of a mathematical operation, or a function call. 

【讨论】:

  • +1 - OP 可以使用静态属性,而不是使用类常量:static $root = $_SERVER['DOCUMENT_ROOT']."project/"
  • 是的,这可能是一个选项,但您可以在php.net/manual/en/language.oop5.static.php 找到“无法使用实例化的类对象访问声明为静态的属性”.. 可能是一个配置文件(可以是一个类),其中定义了这个值..可以只定义为一个字符串并在每个服务器上进行更改(就像任何配置值一样)以避免依赖于 $_SERVER 超全局..
  • 这 jsut 意味着它不能像 $instance->root 那样被访问,而是你必须总是这样做 TheClassName::$root 但你绝对可以从一个实例访问和更改该值 - 你只需要使用静态符号。
  • 不能用变量的值分配常量的想法是愚蠢的。如果这就是 PHP 的建立方式,那么编写该标准的委员会在某些基本的计算机科学概念方面是无能的。常量的目的是防止程序员像变量一样意外地改变它的值。这并不是为了防止任何变量首先被用于创建该常量。您可以轻松地尝试从变量中获取值并将其锁定为不变的常量。根据 CS 前提,这是完全有效的。
【解决方案2】:

常量不能有变量。

我建议你不要依赖$_SERVER['DOCUMENT_ROOT'],相反,你可以自己定义ROOT

例如,您在文档根目录中有一个config.php,您可以这样做

define('ROOT', __DIR__.'/'); // php version >= 5.3
define('ROOT', dirname(__FILE__).'/'); // php version < 5.3

然后改用ROOT

【讨论】:

    【解决方案3】:

    为什么不在您的__construct() 中设置它。从技术上讲,这就是它的用途。

    class Dir {
    
        public function __construct() {
            self::ROOT = $_SERVER['DOCUMENT_ROOT']."project/";
        }
    }
    

    【讨论】:

      【解决方案4】:

      我建议您使用此解决方案,因为您想使用 OOP 并且所有人都必须在课堂内。因此,由于无法直接使用 const 或 static var,我将使用静态函数:

      class Dir
      {
          public static function getRoot()
          {
              return $_SERVER['DOCUMENT_ROOT'] . 'project/';
          }
      }
      

      你可以像这样使用它

      Dir::getRoot();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-03
        • 1970-01-01
        • 1970-01-01
        • 2011-04-25
        • 1970-01-01
        相关资源
        最近更新 更多