如何检查字符串是否可以在PHP中用作变量名?

Kor*_*tak 7 php variables object names variable-variables

在PHP中,可以使用变量变量......

例如...

class obj { }
$fieldName = "Surname";
$object = new obj();
$object->Name = "John";
$object->$fieldName = "Doe";
echo "{$object->Name} {$object->Surname}"; // This echoes "John Doe".
Run Code Online (Sandbox Code Playgroud)

但是,$ fieldName字符串可能包含变量名称中不允许的某些字符.PHP仍然会创建具有该名称的字段(很像关联数组),但我无法使用$ object - > ......访问它,因为它无法正确解析.

现在,是否有任何函数可以检查字符串是否可以用作有效的PHP变量名.如果没有,如何使用正则表达式创建它?PHP中的变量名称有哪些规则?

Tim*_*tle 15

手册:

变量名称遵循与PHP中其他标签相同的规则.有效的变量名称以字母或下划线开头,后跟任意数量的字母,数字或下划线.作为正则表达式,它将表达如下:'[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*'

因此,如果您通过RegEx运行字符串,您应该能够判断它是否有效.

应该注意,使用变量变量访问"无效"Object属性名称的能力是某些XML解析的正确方法.

例如,来自SimpleXML文档:

访问包含PHP命名约定下不允许的字符的XML文档中的元素(例如连字符)可以通过将元素名称封装在大括号和撇号中来实现.

接下来是这个代码示例:

echo $xml->movie->{'great-lines'}->line;
Run Code Online (Sandbox Code Playgroud)

因此,拥有只能以这种方式访问​​的属性并不一定是错的.

但是,如果您的代码都创建并使用了对象 - 那么您会想知道为什么要使用这些属性.当然,允许类似于SimpleXML示例的情况,其中创建对象以表示控件范围之外的内容.


Rob*_*oli 9

因为它已被回复,但没有完整的代码行:

if ( preg_match('/^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*$/','evaluation string') )
{
    // the string is valid
}
else
{
    // the string is not valid
}
Run Code Online (Sandbox Code Playgroud)