PHP变量,方法,类等名称中的有效字符是什么?

Nik*_*kiC 30 php

在变量,常量,函数,方法,类等的PHP名称中可以使用哪些有效字符?

手动有一些 提到的正则表达式[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*.这个限制什么时候适用,什么时候不适用?

Nik*_*kiC 52

[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
Run Code Online (Sandbox Code Playgroud)

请注意,此正则表达式是每字节字节应用的,不考虑编码.这就是为什么它还允许许多奇怪的Unicode名称.

但正则表达式限制名称的这些"直接"使用.通过PHP提供的各种动态功能,可以使用几乎任意的名称.

通常,您不应该假设 PHP中的哪些字符名称可以包含.在大多数情况下,它们只是任意字符串.像"验证某些东西是否是有效的类名"这样的事情在PHP中毫无意义.

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

变量

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

${''} = 'foo';
echo ${''};      // foo
${"\0"} = 'bar';
echo ${"\0"};    // bar
Run Code Online (Sandbox Code Playgroud)

常量

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

define('', 'foo');
echo constant('');   // foo
define("\0", 'bar');
echo constant("\0"); // bar
Run Code Online (Sandbox Code Playgroud)

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

属性

属性不能是空字符串,不能以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
Run Code Online (Sandbox Code Playgroud)

方法

方法名称是任意的,可以通过__callmagic 处理:

class Test {
    public function __call($method, $args) {
        echo "Called method \"$method\"";
    }
}

$obj = new Test;
$obj->{''}();    // Called method ""
$obj->{"\0"}();  // Called method "\0"
Run Code Online (Sandbox Code Playgroud)

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!
Run Code Online (Sandbox Code Playgroud)

功能

我不知道从userland创建任意函数名的方法,但仍有一些内部代码产生"怪异"名称:

var_dump(create_function('',''));
// string(9) "\0lambda_1"
Run Code Online (Sandbox Code Playgroud)