请考虑以下代码段及其各自的输出:
代码段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]
但在第二个程序中,当我尝试打印数组键中包含的值并且数组是对象属性时,我收到通知。
我不明白为什么我为第二个程序获取数组到字符串转换通知。
有人,请通过好的解释清除差异并帮助我在第二个程序中打印数组键值。
答案 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,而不是双引号 - 仍然包含在{}
中):