【问题标题】:What are the valid characters in PHP variable, method, class, etc names?PHP 变量、方法、类等名称中的有效字符是什么?
【发布时间】:2013-07-31 14:36:03
【问题描述】:

您可以在 PHP 名称中为变量、常量、函数、方法、类...使用哪些有效字符?

手册中有somementions的正则表达式[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*。此限制何时适用,何时不适用?

【问题讨论】:

    标签: php


    【解决方案1】:

    [a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]* 正则表达式仅适用于名称直接用于某些特殊语法元素的情况。一些例子:

    $varName           // <-- varName needs to satisfy the regex
    $foo->propertyName // <-- propertyName needs to satisfy the regex
    class ClassName {} // <-- ClassName needs to satisfy the regex
                       //     and can't be a reserved keyword
    

    请注意,此正则表达式是逐字节应用的,不考虑编码。这就是为什么它也是allows many weird Unicode names

    但正则表达式限制这些“直接”使用名称。通过 PHP 提供的各种动态特性,几乎可以使用任意名称。

    一般而言,您不应假设 PHP 中的名称可以包含哪些字符。在大多数情况下,它们只是任意字符串。像“验证某事是否是一个有效的类名”这样的事情在 PHP 中是没有意义的。

    在下文中,我将提供一些示例,说明如何为不同类别创建奇怪的名称。

    变量

    变量名可以是任意字符串:

    ${''} = 'foo';
    echo ${''};      // foo
    ${"\0"} = 'bar';
    echo ${"\0"};    // bar
    

    常量

    全局常量也可以是任意字符串:

    define('', 'foo');
    echo constant('');   // foo
    define("\0", 'bar');
    echo constant("\0"); // bar
    

    没有办法动态定义我知道的类常量,所以这些不能是任意的。创建奇怪的类常量的唯一方法似乎是通过扩展代码。

    属性

    属性不能是空字符串,也不能以 NUL 字节开头,但除此之外它们是任意的:

    $obj = new stdClass;
    $obj->{''} = 'foo';   // Fatal error: Cannot access empty property
    $obj->{"\0"} = 'foo'; // Fatal error: Cannot access property started with '\0'
    $obj->{'*'} = 'foo';
    echo $obj->{'*'};     // foo
    

    方法

    方法名是任意的,可以被__callmagic处理:

    class Test {
        public function __call($method, $args) {
            echo "Called method \"$method\"";
        }
    }
    
    $obj = new Test;
    $obj->{''}();    // Called method ""
    $obj->{"\0"}();  // Called method "\0"
    

    可以使用class_alias 创建任意类名,但空字符串除外:

    class Test {}
    
    class_alias('Test', '');
    $className = '';
    $obj = new $className; // Fatal error: Class '' not found
    
    class_alias('Test', "\0");
    $className = "\0";
    $obj = new $className; // Works!
    

    功能

    我不知道从用户空间创建任意函数名称的方法,但在某些情况下内部代码会产生“奇怪”的名称:

    var_dump(create_function('',''));
    // string(9) "\0lambda_1"
    

    【讨论】:

    【解决方案2】:

    NikiC has 除了函数之外的所有这些。使用变量函数,您可以使用任何您想要的名称,尽管语法很烂。

    ${'=^^='}=function(){
       echo "Hello Kitty!";
    };
    
    ${'=^^='}(); // Outputs "Hello Kitty!"
    

    【讨论】:

    • 那不是函数名,是变量名。 NikiC 一直拥有它们。
    猜你喜欢
    • 2012-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多