gpt4 book ai didi

php - 未解析基本语法的解决方法

转载 作者:行者123 更新时间:2023-12-04 06:54:53 25 4
gpt4 key购买 nike

我想要一个类属性,允许在等号的右侧进行表达式。所有版本的 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 不允许这样的事情。任何人都可以想出一种可以保持以下代码的可读性和 future 可扩展性的解决方法吗?

最佳答案

在 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,
);

此类声明行为的原因如下:表达式就像动词。他们做某事。类就像名词:它们声明一些东西。声明性语句永远不会产生 Action 语句的副作用。要求原始默认值强制执行此规则。

考虑到这一点,我们可以如下重构原始类:
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'));

关于php - 未解析基本语法的解决方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2671928/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com