在学习PHP中的oop时,我注意到属性声明接受一个数组作为这里提到的值PHP documentation
class Test{
public $var7 = array(true, false);
}
我注意到文档说:
This declaration may include an initialization, but this initialization must be a constant value–that is, it must be able to be evaluated at compile time and must not depend on run-time information in order to be evaluated.
在阅读了this文章以了解编译过程是如何工作的之后,我意识到在编译过程中,如果有可能像下面的代码片段那样评估和优化一些表达式:
var x = strlen ("testing") => int(7);
如果在声明属性的过程中使用数组作为值,因为它在编译过程中被计算,那么为什么在编译过程中可以在逻辑上对它们进行评估时,下面的初始化不起作用,这是初始化属性的条件类?
Class Test {
public $vars=strlen("random"); // Fails
}
解决方法:
对你的问题的简短回答是strlen()是一个函数而array()是一个keyword.
要理解的关键区别在于,无论上下文如何,关键字始终引用相同的内容.
来自PHP.net:
These words have special meaning in PHP. Some of them represent things which look like functions, some look like constants, and so on – but they’re not, really: they are language constructs. You cannot use any of the following words as constants, class names, function or method names.
考虑这个简单的例子:
首先我们称之为“functions.PHP”的文件.
//functions.PHP
namespace My_Project_Namespace;
function strlen($string){
return 10; //In my project, all strings are length 10! 10 is a nice round number...
}
在这个文件中,我用另一个覆盖了内置的strlen()函数.这是可能的,因为我的函数是在namespace(在这种情况下,My_Project_Namespace)中定义的.
现在考虑一下你的文件,但是这一次让它放在我们的命名空间中(你应该将所有函数和类命名为间距)
//Test.PHP
namespace My_Project_Namespace;
Class Test {
public $vars=strlen("random"); // Fails
}
strlen()有2个定义,具体取决于命名空间.由于知道当前命名空间取决于运行时信息,因此编译器无法知道在类中初始化使用哪个.即使您没有定义自定义strlen()函数,您仍然无法执行此操作,因为知道没有其他版本strlen()也取决于运行时信息!
array()是一个完全不同的野兽.它是一个关键字,你不能为array()定义另一个含义,所以编译器不必担心一个现有的.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。