考虑以下代码片段及其各自的输出:
代码片段 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]
但在第二个程序中,当我尝试打印包含在数组键中的值并且该数组是一个对象属性时,我收到了一条通知。
我不明白为什么我会收到第二个程序的数组到字符串转换通知。
有人,请给我解释清楚差异,并帮助我在第二个程序中打印数组键值。
最佳答案
PHP 可以正确确定您在第一个代码块中引用的预期元素和对象。然而,在第二种情况下,PHP 希望非常清楚如何访问对象的元素。在其他情况下,PHP 竭尽全力简化编码(类型判断和其他此类功能),但在这种情况下,它需要控制我们并要求脚本清晰。
你只需要改进你的语法。
使用花括号来修复它。 ( 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,而不是双引号——它仍然包含在 {}
中):
关于php - 打印包含在数组键中的值和打印包含在对象属性的数组键中的值有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47816017/