我想要一个类属性,该表达式允许在等号的右侧进行表达式。所有版本的PHP都会阻塞以下代码,但是这种编写方式是为了将来更容易扩展。
/* Example SDK Class */ class SDK { /* Runtime Option Flags */ // Strings # 0: Makes no change to the strings. var $STRING_NONE = (1 << 0); # 1: Removes color codes from the string. var $STRING_STRIP_COLOR = (1 << 1); # 2: Removes language codes from the string. var $STRING_STRIP_LANG = (1 << 2); # 3: Removes all formatting from the string. var $STRING_STRIP = SELF::STRING_STRIP_COLOR & SELF::STRING_STRIP_LANG; # 4: Converts color codes to HTML & UTF-8. var $STRING_HTML = (1 << 3); # 8: Converts color codes to ECMA-48 escape color codes & UTF-8. var $STRING_CONSOLE = (1 << 4); # 16: Changes player names only. var $STRING_NAMES = (1 << 5); # 32: Changes host names only. var $STRING_HOSTS = (1 << 6); function SDK($fString = SELF::STRING_HTML & SELF::STRING_NAMES & SELF_HOST) { // constructor code. } } $SDK &= new SDK(SDK::STRING_NONE);
(1 << 0)对我来说,这似乎是非常基本的语法,并且为什么PHP不允许这样的事情是不可理解的。谁能想到可以保持以下代码的可读性和将来可扩展性的解决方法?
(1 << 0)
在PHP中声明类常量或属性时,只能为默认值指定原始值。因此,例如,该类声明将不起作用:
class TEST { const ABC = 2 * 4; const DEF = some_function(); static $GHI = array( 'key'=> 5 * 3, ); }
但是该类声明将:
class TEST { const ABC = 8; static $GHI = 15; }
这些规则适用 于类常量/属性的默认值 -您始终可以使用表达式的结果初始化其他变量:
$a= array( 'a'=> 1 * 2, 'b'=> 2 * 2, 'c'=> 3 * 2, );
此类声明行为的原因如下:表达式就像动词。他们 做某事 。类就像名词:它们 声明某些东西 。声明性声明绝不应该产生动作声明的副作用。需要原始默认值将强制执行此规则。
考虑到这一点,我们可以如下重构原始类:
class SDK { static protected $_types= null; static public function getType($type_name) { self::_init_types(); if (array_key_exists($type_name, self::$_types)) { return self::$_types[$type_name]; } else { throw new Exception("unknown type $type_name"); } } static protected function _init_types() { if (!is_array(self::$_types)) { self::$_types= array( 'STRING_NONE'=> 1 << 0, // ... rest of the "constants" here 'STRING_HOSTS'=> 1 << 6 ); } } function __construct($fString = null) { if (is_null($fString)) { $fString= self::getType('STRING_NONE') & self::getType('STRING_HOSTS'); } var_dump($fString); } } $SDK &= new SDK(SDK::getType('STRING_HOSTS'));