8

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

例如...

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

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

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

4

7 回答 7

16

手册

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

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

应该注意的是,使用可变变量访问“无效”对象属性名称的能力是某些 XML 解析的正确方法。

例如,来自SimpleXML文档:

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

后跟此代码示例:

echo $xml->movie->{'great-lines'}->line;

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

但是,如果您的代码既创建又使用对象 - 人们会想知道为什么要使用这些属性。当然,允许出现类似于SimpleXML示例的情况,即创建一个对象来表示您的控制范围之外的内容。

于 2010-10-20T16:33:21.820 回答
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
}
于 2012-02-29T10:57:50.900 回答
4

'[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*'将验证 PHP 变量名。

此正则表达式直接来自以下文档:http ://www.php.net/manual/en/language.variables.basics.php

于 2010-10-20T16:32:20.133 回答
1

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

您仍然可以通过$object->{"fieldname"}语法访问该字段。

据我所知,唯一的限制是您不能访问\x00名称中的属性,也不能定义以 . 开头的变量\x00

例子:

$a = new stdclass;
$a->{"\x00dd"} = 8; //invalid
$a->{"dd\x00dd"} = 8; //valid, but...
echo $a->{"dd\x00dd"}; //can't read (no property "dd")
于 2010-10-20T16:36:28.480 回答
1

但我将无法使用 $object->...... 访问它,因为它无法正确解析

但看:

class A {}

$varName = '!asd asd';
$a = new A();
$a->$varName = '1';
echo "{$a->{'!asd asd'}}"; // 1

当然不推荐,但可以做到。

于 2010-10-20T16:37:32.570 回答
0

我认为正则表达式是要走的路,据我所知,限制是:

  • 字母数字
  • 必须以字母开头
  • 可以包含下划线

所以正则表达式将是“/[a-zA-Z]+[0-9a-zA-Z_]*/” - 我的头顶,所以你的里程可能会有所不同。

于 2010-10-20T16:34:52.687 回答
0

如果您想允许$&$(通过引用传递变量)在字符串中进行验证,则使用正则表达式进行验证,您可以使用此正则表达式:

/^([\$]|(&\$))[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/
于 2017-03-24T23:39:32.220 回答