【问题标题】:Can I use string concatenation to define a class CONST in PHP?我可以使用字符串连接在 PHP 中定义一个类 CONST 吗?
【发布时间】:2011-02-16 16:40:31
【问题描述】:

我知道您可以使用字符串连接来创建全局常量:

define('FOO', 'foo');
define('BAR', FOO.'bar');  
echo BAR;

将打印“foobar”。

但是,我尝试使用类常量执行相同操作时遇到错误。

class foobar {
  const foo = 'foo';
  const foo2 = self::foo;
  const bar = self::foo.'bar';
}

foo2 的定义没有问题,但是声明 const bar 会出错

解析错误:语法错误,意外的 '.',期待 ',' 或 ';'

我也尝试过使用像 sprintf() 这样的函数,但它不喜欢左括号,而不是字符串连接符 '.'。

那么除了像 foo2 这样的简单集合案例之外,还有什么方法可以根据彼此创建类常量?

【问题讨论】:

    标签: php class constants


    【解决方案1】:

    恕我直言,这个问题应该得到 PHP 5.6+ 的答案,感谢@jammin comment

    从 PHP 5.6 开始,您可以为常量定义静态标量表达式:

    class Foo { 
      const BAR = "baz";
      const HAZ = self::BAR . " boo\n"; 
    }
    

    虽然这不是问题的一部分,但应该意识到实施的局限性。以下内容不起作用,尽管它是静态内容(但可能在运行时被操纵):

    class Foo { 
      public static $bar = "baz";
      const HAZ = self::$bar . " boo\n"; 
    }
    // PHP Parse error:  syntax error, unexpected '$bar' (T_VARIABLE), expecting identifier (T_STRING) or class (T_CLASS)
    
    class Foo { 
      public static function bar () { return "baz";}
      const HAZ = self::bar() . " boo\n"; 
    }
    // PHP Parse error:  syntax error, unexpected '(', expecting ',' or ';'
    

    欲了解更多信息,请查看:https://wiki.php.net/rfc/const_scalar_exprshttp://php.net/manual/en/language.oop5.constants.php

    【讨论】:

      【解决方案2】:

      这可能不是您正在寻找的直接内容,但我遇到了这个线程,所以这是我用于解决我遇到的问题的解决方案(基于@user187291 的回答):

      define('app_path', __DIR__ . '/../../');
      const APPLICATION_PATH = app_path;
      .
      .
      .
      require_once(APPLICATION_PATH . "some_directory/some_file.php");
      .
      .
      .
      

      看起来效果不错!

      【讨论】:

        【解决方案3】:

        唯一的方法是定义一个表达式,然后在类中使用该常量

        define('foobar', 'foo' . 'bar');
        
        class Foo
        {
            const blah = foobar;
        }
        
        echo Foo::blah;
        

        另一种选择是访问 bugs.php.net 并请求他们修复此问题。

        【讨论】:

        • 我不明白全局常量和类常量之间设置器行为不同的基本原理。我想我很快就会访问 bugs.php.net :) 但就短期而言,我可能只是将常量移出类,然后将它们复制到类中。太笨拙了!
        • bug.php.net 基本上告诉我他们不会修复它。 “这是实现中的一个限制。对于类常量,我们在编译时需要一个常量值,并且不能评估表达式。define() 是一个常规函数,在运行时评估,因此可以包含任何形式的任何值。改变这意味着在编译器中添加一个执行阶段......”这实际上是BS,因为以下代码有效:define('BAR', ThisWorks::foo . 'bar');类 ThisWorks { const foo = 'foo';常量条 = BAR;回声 ThisWorks::bar;这将输出 'foobar' 而不会出错。
        • 对于寻找它的其他人,该错误是#42355
        • @helvete 这个问题可能会发生(对于其他程序员,而不仅仅是 OP),因为目前(2015 年底)php.net 仍然提供 5.4 和 5.5 Windows 版本的二进制文件!同样对于 mint/ubuntu(也可能是 debian),开箱即用的 php 版本是 5.5!
        【解决方案4】:

        对于 class 常量,除了常量表达式之外,您不能分配任何东西。引用PHP manual

        “值必须是常量表达式,而不是(例如)变量、属性、数学运算的结果或函数调用。”

        【讨论】:

          【解决方案5】:

          对于此类内容,请始终使用可靠的手册。

          关于constants

          值必须是常数 表达式,而不是(例如)a 变量,属性,结果 数学运算或函数 打电话。

          所以......“不”将是答案:D

          【讨论】:

            猜你喜欢
            • 2010-10-31
            • 1970-01-01
            • 2020-11-28
            • 2011-09-20
            • 2013-01-27
            • 2011-04-12
            相关资源
            最近更新 更多