Рассмотрим ниже фрагменты кода и их соответствующие выводы:
Фрагмент кода 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 наклоняется назад, чтобы упростить кодирование (жонглирование типами и другие подобные функции), но в этом случае он должен влиять на нас и требовать ясности в сценарии.
Вам нужно только улучшить свой синтаксис.
Используйте фигурные скобки, чтобы исправить это. (демонстрация)
<?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]}.";
?>
Похожая демонстрация от руководство (хотя этот использует nowdoc, а не двойные кавычки — все еще это {}
):
Других решений пока нет …