PHP变量,方法,类等名称中的有效字符是什么?
您可以在PHP名称中为变量,常量,函数,方法,类等使用的有效字符是什么?
手册中提到了一些
正则表达式。此限制何时适用,什么时候不适用[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*
回答:
[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
但是正则表达式 仅 限制名称的这些“直接”使用。通过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
方法
方法名称是任意的,可以用__call
魔术来处理:
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"
以上是 PHP变量,方法,类等名称中的有效字符是什么? 的全部内容, 来源链接: utcz.com/qa/407144.html