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

使用简单表达式初始化PHP类属性声明会产生语法错误

曹疏珂
2023-03-14
问题内容

根据PHP文档,可以在具有以下限制的类中初始化属性:

“此声明可以包括一个初始化,但是此初始化必须是一个常量值,也就是说,它必须能够在编译时进行评估,并且必须不依赖于运行时信息才能进行评估。”

我正在尝试初始化数组并遇到一些问题。虽然这很好用:

public $var = array(
    1 => 4,
    2 => 5,
);

这会产生语法错误:

public $var = array(
    1 => 4,
    2 => (4+1),
);

甚至不被接受:

public $var = 4+1;

这表明它不是array()语言构造的限制。

现在,我最后一次检查时,“ 4 + 1”等于一个常数值,不仅应该接受它,而且实际上应该对其进行优化。无论如何,它肯定可以在编译时进行评估。

那么这是怎么回事?相对于“可以在编译时求值”的任何表达式而言,限制是否真的遵循“根本不能有任何计算出的表达式”的思路?在文档语言中使用“求值”表示允许进行简单的计算,但是a。

如果这是PHP中的错误,是否有人有错误ID?我试图找到一个,但是没有任何运气。


问题答案:

PHP在编译时不执行此类操作;即使所有运算符本身都是常量,也不能将计算值分配给常量。类成员的默认值的处理方式完全相同。我在尝试将2的幂分配给常量时遇到了这种现象:

class User {
    const IS_ADMIN = 1;
    const IS_MODERATOR1 = 1 << 1; // Won't work
    const IS_MODERATOR2 = 0x02;   // works
}


 类似资料:
  • 7.1.1 概念 数组是具有相同 唯一类型 的一组已编号且长度固定的数据项序列(这是一种同构的数据结构);这种类型可以是任意的原始类型例如整型、字符串或者自定义类型。数组长度必须是一个常量表达式,并且必须是一个非负整数。数组长度也是数组类型的一部分,所以[5]int和[10]int是属于不同类型的。数组的编译时值初始化是按照数组顺序完成的(如下)。 注意事项 如果我们想让数组元素类型为任意类型的话

  • 问题内容: 我想知道在类的主体中或函数内部初始化Python中的对象属性的最佳实践是什么? 即 与 问题答案: 如果要让该类的所有实例共享该属性,请使用类属性: 这导致成为一对。 如果希望每个实例都可自定义属性,请使用实例属性: 这将导致是一个在一对其中是的一个实例。

  • 8.1.1 概念 map 是引用类型,可以使用如下声明: var map1 map[keytype]valuetype var map1 map[string]int ([keytype] 和 valuetype 之间允许有空格,但是 gofmt 移除了空格) 在声明的时候不需要知道 map 的长度,map 是可以动态增长的。 未初始化的 map 的值是 nil。 key 可以是任意可以用 ==

  • 问题内容: 我有两节课,和 通过上面的实现,我得到了错误: 为什么在致电之前必须先设置? 问题答案: 引用Swift编程语言,它回答了您的问题: “ Swift的编译器执行四项有用的安全检查,以确保两阶段初始化完成且没有错误:” 安全检查1“指定的初始值设定项必须确保由其类引入的所有属性在将其委托给超类初始值设定项之前都已初始化。” 摘录自:苹果公司“ The Swift Programming

  • 问题内容: 我可以写: 我也可以写: 但我不能写: 为什么这会被Java阻止? 我知道如何解决它,但有时会更简单。 例如: 自从我学会了如何在Java中玩数组以来,这个简单的问题一直困扰着我。 问题答案: 为什么这会被Java阻止? 你必须询问Java设计人员。该限制可能有一些微妙的语法原因。请注意,某些数组创建/初始化结构不在Java 1.0中,而(IIRC)是在Java 1.1中添加的。 但是

  • 问题内容: 在php中声明属性时,为什么无法将属性初始化为函数?以下代码片段导致 解析错误:语法错误,意外的T_FUNCTION 您还可以将属性初始化为字符串,数字或其他数据类型吗? 编辑: 但是我可以在__construct()方法中将函数分配给属性。以下工作正常: 问题答案: 因为它不是用PHP实现的。 http://www.php.net/manual/zh/language.oop5.pr