当前位置: 首页 > 面试题库 >

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

姜华翰
2023-03-14
问题内容

您可以在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"


 类似资料:
  • 问题内容: ava类名称中哪些字符有效?还有哪些其他规则管理Java类名称(例如,Java类名称不能以数字开头)? 问题答案: 你几乎可以使用任何字符,包括大多数Unicode字符!确切的定义在Java语言规范的3.8:标识符一节中。 一个标识符是无限长序列的Java字母和爪哇位,其中第一个必须是一个爪哇字母。… 字母和数字可能来自整个Unicode字符集,…这允许程序员在使用其母语编写的程序中使

  • 问题内容: 我正在动态创建python类,我知道并非所有字符在此上下文中都是有效的。 我可以在类库中某处使用某种方法来清理随机文本字符串,以便将其用作类名吗?那个或者允许的字符列表将是一个很好的帮助。 关于与标识符名称冲突的补充: 就像在下面的答案中指出的@Ignacio一样,任何可以有效用作标识符的字符都是类名中的有效字符。您甚至可以毫无保留地将保留字用作类名。但是有一个陷阱。如果您确实使用保留

  • 我在实验在不同的关键字和运算符周围是如何解释的,发现以下语法是完全合法的: 错误: 未捕获的引用错误:等待未定义 它似乎试图将解析为变量名。。?我期待着 或者是类似于 意外令牌等待 令我恐惧的是,你甚至可以给它分配一些东西: 如此明显错误的东西不应该导致语法错误吗,就像,,等一样?为什么允许这样做,以及第一个片段中到底发生了什么?

  • 我正在为学校制作一种API,用于定制XML编写器。我有: 我需要帮助的是: 我想创建一个与数据[i]同名的元素。 我使用的是dom4jxml。顺便说一句,放在这个罐子里。 我听说过一种叫做hashmap的方法,如果这是正确的方法,请有人解释一下如何使用它。

  • 我有10个数组列表和一个字符串变量。我有一个函数/方法,允许用户选择要添加到的数组列表之一。目前,该函数将字符串“selected”的值更改为正确的数组列表名称的值。 那么,如何使arrayList的名称等于String变量的值呢?

  • 问题内容: 有没有办法在Javascript中将变量名作为字符串获取?喜欢 我想这样做: 更新 我正在尝试使用JavaScript连接浏览器和另一个程序。我想将实例名称从浏览器发送到另一个程序以用作回调方法: 从另一个程序: 问题答案: 通常,在需要将名称映射到某个值并能够同时检索两者的情况下,可以使用哈希表。