打印数组键中包含的值并打印对象属性的数组键中包含的值的区别是什么?

时间:2017-12-14 14:43:01

标签: php arrays object key type-coercion

请考虑以下代码段及其各自的输出:

代码段1:

<?php
  $juices = array("apple", "orange", "koolaid1" => "purple");

  echo "He drank some $juices[0] juice.".PHP_EOL;
  echo "He drank some $juices[1] juice.".PHP_EOL;

  class people {
    public $john = "John Smith";
  }

  $people = new people();

  echo "$people->john drank some $juices[0] juice.".PHP_EOL;
?>

代码段1的输出:

He drank some apple juice.
He drank some orange juice.
John Smith drank some apple juice.

代码段2:

<?php
  class foo {
    public $foo;
    public $bar;

    function __construct() {
      $this->foo = 'Foo';
      $this->bar = array('Bar1', 'Bar2', 'Bar3');
    }
  }

  $foo = new foo();
  $name = 'MyName';

  echo "My name is \"$name\". I am printing some $foo->foo.
  Now, I am printing some $foo->bar[1].";
?>

代码段2的输出:

Notice: Array to string conversion in hello.php on line 16
My name is "MyName". I am printing some Foo. Now, I am printing some Array[1].

如果你仔细观察,你可以看到,在第一个程序中,我能够打印包含在数组键中的值。 $juices[0], $juices[1]但在第二个程序中,当我尝试打印数组键中包含的值并且数组是对象属性时,我收到通知。

我不明白为什么我为第二个程序获取数组到字符串转换通知

有人,请通过好的解释清除差异并帮助我在第二个程序中打印数组键值。

1 个答案:

答案 0 :(得分:2)

PHP可以正确地确定您在第一个代码块中引用的目标元素和对象。但是,在第二部分中,PHP希望能够清楚地了解如何访问对象的元素。 PHP在其他情况下向后弯曲以使编码变得简单(类型jugging和其他此类功能),但在这种情况下,它需要控制我们并要求脚本清晰。

您只需要改进语法。

使用花括号进行修复。 (Demo

<?php
  class foo {
    public $foo;
    public $bar;

    function __construct() {
      $this->foo = 'Foo';
      $this->bar = array('Bar1', 'Bar2', 'Bar3');
    }
  }

  $foo = new foo();
  $name = 'MyName';

  echo "My name is \"$name\". I am printing some $foo->foo.
  Now, I am printing some {$foo->bar[1]}.";
?>

来自the manual的类似演示(虽然这个使用了nowdoc,而不是双引号 - 仍然包含在{}中):

enter image description here