为什么echo“{self :: class}”打印有效的类名

时间:2017-09-29 19:36:04

标签: php

让我们说这是我的PHP课程:

Class Test {

  public function __construct() {}

  public function test() {
      $myInfoMsg = "{self::class}: New User created";
      echo $myInfoMsg;
  }

 public function test2() {
      $myInfoMsg = self::class . " : New User created";
      echo $myInfoMsg;

    }
}

$a = new Test();
$a->test();
$a->test1();

我为test()获得的输出如下:

{self::class}: New User created

对于test2(),我得到以下输出:

Test: New User created

那么为什么不self::classtest()打印课程名称?

2 个答案:

答案 0 :(得分:1)

你不能这样做。来自documentation

  

复杂(卷曲)语法

     

这不称为复杂,因为语法很复杂,但因为它允许使用复杂的表达式。

     

可以通过此语法包含任何具有字符串表示形式的标量变量,数组元素或对象属性。只需以与字符串外部相同的方式编写表达式,然后将其包装在{和}中。 由于{无法转义,因此仅当$紧跟{

后才会识别此语法。

您的问题的替代方案是:

ip:port/myapp/bo/bo

答案 1 :(得分:0)

self::class是一个关键字(嗯,两个关键字)。它在编译阶段被替换为一个字符串,该字符串包含使用它的类的全名。

"self::class"double quoted string

"{self::class}"也是双引号字符串。即使{self::class}看起来类似于variable in a double quoted string,它也不是变量,也不会以任何特殊方式进行解释。这正是你在这里看到的字符串,无论它出现在什么上下文中。

双引号字符串中只有变量为identified and replaced