微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PHP属性decleration接受数组,不接受可在编译过程中评估的任何其他表达式

在学习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 举报,一经查实,本站将立刻删除。

相关推荐