当前位置: 首页 > 面试题库 >

无法解析基本语法的解决方法

闽念
2023-03-14
问题内容

我想要一个类属性,该表达式允许在等号的右侧进行表达式。所有版本的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不允许这样的事情是不可理解的。谁能想到可以保持以下代码的可读性和将来可扩展性的解决方法?


问题答案:

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


 类似资料:
  • 词法解析、语法解析 这一节我们分析下PHP的解析阶段,即 PHP代码->抽象语法树(AST) 的过程。 PHP使用re2c、bison完成这个阶段的工作: re2c: 词法分析器,将输入分割为一个个有意义的词块,称为token bison: 语法分析器,确定词法分析器分割出的token是如何彼此关联的 例如: $a = 2 + 3; 词法分析器将上面的语句分解为这些token:$a、=、2、+、3

  • 我在WEB-INF内的lib文件夹和Tomcat lib中添加了许多jar,试图解决这个问题,但没有结果(commons-beanutils-1.8.1、commons-collections-3.2.1、commons-lang-2.5、commons-logging-1.1.1、ezmorph-1.0.6、java-json、javax.json-1.0、json-lib-2.4-jdk15、

  • 我正在通过Android Studio中的一个应用程序工作,该应用程序使用学校意图传递数据。我已经创建了传递数据的对象,并启动了,但是我不断收到一个警告,说我的方法无法解析。有什么想法吗?提前谢了。

  • 正如文件所述: Android O允许您通过在res/字体/文件夹中添加字体文件来捆绑字体作为资源。 结果: 您可以使用getFont(int)方法检索字体,其中需要传递要检索的字体的资源标识符。此方法返回Typeface对象。这将对字体的第一个重量或样式变体(如果是字体系列)进行编码。然后可以使用字体。create(typeface,style)方法来检索特定样式。 注意:TextView已经为

  • > 在菜单项和添加导航头之间导航的代码由一个方法组成。 由于作者没有提到在哪里粘贴这段代码,我粘贴在我的文件中 在菜单项之间导航和添加导航标题之间的代码是否由我粘贴在正确的位置? 在方法selectDrawerItem(MenuItem MenuItem)中有一条注释,创建一个新片段,并根据位置指定要显示的行星,作者是否希望我在这里添加一些内容。

  • 我正在尝试构建一个java。net应用程序,其中客户端和服务器必须通过串行收集类型(如字节[])相互发送数据。 由于未知原因,我的DataInputStream无法解析方法readAllBytes()。 一个朋友把它扔进了IDE,它没有抱怨。我不确定这怎么会是一个版本问题,但我检查了一下,并没有误解我的项目。我正在使用Java 8。 实际上,我确信应该支持这个方法,但我不明白为什么不支持,因为它是