Описание: Или не очень сложные... |
Поиск в теме | Версия для печати |
Furax |
Отправлено: 26 Апреля, 2007 - 04:10:05
|
Бледнотик
Покинул форум
Сообщений всего: 1472
Дата рег-ции: Март 2007
Откуда: Иркутск, Сибирь, СССР
Карма 32
|
Доброго времени суток!
Профессионалы, ответьте на вопрос новичка: неужто PHP не умеет работать со сложными выражениями, а только с самыми простыми? Изучая этот язык, столкнулся с тем, что выражения такого типа, к каким я привык в C++, приводят интерпретатор в замешательство... Неужто надо себя ограничивать?
Приведу пару примеров:
CODE:<?php
function getArray()
{
return array('Полезные данные', 'Всякая чушь...');
}
$data=getArray()[0];
?> Выдаёт следующее: Parse error: parse error, unexpected '[' in z:\home\test\www\bad1.php on line 7
Вот такой текст:
CODE:<?php
$users=array(array('nickname' => 'Петя', 'login' => 'petya'), array('nickname' => 'Саша', 'login' => 'sasha'));
print "Пользователь $users[1][nickname] написал:";
?> выдаёт: Пользователь Array[nickname] написал:
Даже если сделать так:
CODE:<?php
$users=array(array('nickname' => 'Петя', 'login' => 'petya'), array('nickname' => 'Саша', 'login' => 'sasha'));
print "Пользователь [$users[1][nickname]] написал:";
?> всё равно имеем: Пользователь [Array[nickname]] написал:
Я чего-то не так делаю или действительно такие приёмы для PHP уже чресчур сложны? |
|
|
Jakeryf |
Отправлено: 26 Апреля, 2007 - 20:25:20
|
Junior Member
Покинул форум
Сообщений всего: 56
Дата рег-ции: Нояб. 2006
Откуда: Барнаул
Карма 2
|
Furax пишет:$data=getArray()[0]; - чушь полная, в каком языке такое возможно?
CODE:
<?php
function getArray()
{
return array("Полезные данные", "Всякая чушь...");
}
$data=getArray();
echo $data[1];
?>
Вот так попробуй
CODE:
<?php
$users=array(array('nickname' => 'Петя', 'login' => 'petya'), array('nickname' => 'Саша', 'login' => 'sasha'));
print "Пользователь ".$users[1]['nickname']." написал:";
?>
|
|
|
Furax |
Отправлено: 27 Апреля, 2007 - 01:15:10
|
Бледнотик
Покинул форум
Сообщений всего: 1472
Дата рег-ции: Март 2007
Откуда: Иркутск, Сибирь, СССР
Карма 32
|
Jakeryf
Такие конструкции с успехом идут в таких языках, как C, C++ и JavaScript, где можно обращаться к элементу массива, возвращаемого любым выражением. Очевидно, в PHP это не так? Странно, я почему-то думал, что идеология выражений применяется во всех современных языках... О том и спрашиваю.
О способе с конкатенацией я знаю, меня интересовал именно inline... |
|
|
Ray Wen |
Отправлено: 27 Апреля, 2007 - 01:50:58
|
Собиратель шишек...
Покинул форум
Сообщений всего: 2602
Дата рег-ции: Янв. 2005
Откуда: Волгоград
Карма 21
|
Furax
Furax пишет:$data=getArray()[0];
Подобной конструкции точно нету ни в одном из языков... Каким образом можно поставить [0] к функции? Это ведь не массив...
Furax пишет:print "Пользователь $users[1][nickname] написал:";
Строковые переменные должны быть в скобках...
Jakeryf пишет:print "Пользователь ".$users[1]['nickname']." написал:";
В общем нужно лишь изучить грамматику... |
|
|
Furax |
Отправлено: 27 Апреля, 2007 - 09:27:45
|
Бледнотик
Покинул форум
Сообщений всего: 1472
Дата рег-ции: Март 2007
Откуда: Иркутск, Сибирь, СССР
Карма 32
|
Jakeryf
Ray Wen
Нет уж, извините, никак не могу с вами согласиться, так как сам не первый год на C++ пишу, да и JavaScript подобные вещи совершенно нормально обрабатывает. Первый пример, который приходит в голову - что-нибудь типа этого:
CODE:...
<body onload="document.getElementsByTagName('h1')[0].innerHTML='Добро пожаловать!';">
<h1>Загрузка страницы...</h1>
... (Пример явно дурной, прошу прощения, но зато сам трюк он демонстрирует.)
Дело, насколько я понимаю, в том, что основной структурной единицей таких языков, как C++ и написанный по его образу и подобию JavaScript, является выражение. Обращение к переменной с их точки зрения - это тоже выражение. То есть в моём примере сначала происходит поиск переменной по имени document; затем то, что вернуло это выражение, интерпретируется как объект, и у него вызывается метод getElementsByTagName, который, в свою очередь, что-то возвращает. Возвращённое этим методом значение интерпретируется как массив и происходит обращение к его нулевому элементу, который и возвращается. Затем, наконец, происходит присвоение значения, стоящего в правой части оператора присваивания (слава Всевышнему, это просто строчный литерал), свойству innerHTML этого объекта. Вот, вроде, и всё. PHP, судя по всему, работает не так. Так вот я и спрашиваю: а как? Видимо, надо с этим вопросом пойти, скажем, на PHP.net или ZEND.org. Или исходники почитать...
Значит, в строку может быть непосредственно внедрена или строковая переменная, или, максимум, массив строковых элементов единичной глубины? Грустно... |
|
|
Furax |
Отправлено: 28 Апреля, 2007 - 02:23:57
|
Бледнотик
Покинул форум
Сообщений всего: 1472
Дата рег-ции: Март 2007
Откуда: Иркутск, Сибирь, СССР
Карма 32
|
Jakeryf пишет:мне просто интересно
Бога ради, если это такая интересная для тебя тема, могу написать. На JavaScript:
CODE:function getArray()
{
return new Array("Полезная информация", "Всякая чушь");
}
data=getArray()[0];
Работает совершенно спокойно. На C++ подобный (говорю сразу: не тождественный!) код выглядит чуточку посложнее:
CODE:#include <iostream>
char** getArray();
void main()
{
std::cout << getArray()[0];
}
char** getArray()
{
char **array=new char*[2];
array[0]="Useful information";
array[1]="Some empty words...";
return array;
} Только не надо говорить, что возвращаю я не массив, а указатель на него - вернуть локальный массив мне никто не позволит, а возвращать глобальный неинтересно.
Если тебе действительно интересно, могу привести чуть более сложный пример на JavaScript:
CODE:function getArray()
{
return new Array(a, b);
}
function a()
{
return new Array(c, d);
}
function b()
{
return new Array(e, f);
}
function c()
{
return new Array('Раз!', 'Два!');
}
function d()
{
return new Array('Три!', 'Четыре!');
}
function e()
{
return new Array('Пять!', 'Шесть!');
}
function f()
{
return new Array('Семь!', 'Восемь!');
}
data=getArray()[0]()[1]()[0]; Пример, опять же, дутый, но, как мне кажется, познавательный. На C++ писать то же самое не хочу - слишком длинное получится сообщение.
Jakeryf пишет:это немного не то что ты написал
Согласен с точностью до терминологии - действительно,
CODE:document.getElementsByTagName('h1') instanceof Array выдаёт false, так как возвращаемое этим методом значение будет относиться не к типу массива, а к типу коллекции. Можно долго спорить об отношениях между этими двумя типами, но я бы не хотел начинать здесь эту дискуссию.
Jakeryf пишет:По подобию С++ является язык Java, но назвать JavaScript назвать Cи подобным можно с трудом.
Зы РНР тоже является Си подобным языком. Опять же, я был бы внимательнее к терминологии. Синтаксис в C, C++ и JavaScript один (почти). Да и PHP, в принципе, мало что добавил, хотя не признать некоторые отличия нельзя. Но по концепции как C, так и PHP являются функционально-ориентированными (ибо даже в версии PHP5 объектная модель, насколько мне известно, остаётся достаточно сырой), в то время как C++ (в большей мере, конечно, C#) и JavaScript уже относятся к классу объектно-ориентированных (JavaScript, конечно, правильнее назвать основанным на объектах, т. к. пользовательских определений классов на данном этапе в нём нет) и имеют во многом схожую идеологию. То есть, как мне кажется, PHP стоит всё же ближе к C, чем к C++, а с JavaScript ситуация обратная. Про Java ничего сказать не могу, так как сам его не изучал - нехай себе C++ -подобный.
И всё же, возвращаясь к основной мысли данной темы: теперь, когда скептики наконец увидят (я надеюсь), что сходные конструкции присутствуют во многих языках, быть может, кто-нибудь мне скажет, почему PHP меня за них ругает? Является ли это следствием другой идеологической основы этого языка, простой недоработкой в интерпретаторе или всё же следствием моего недопонимания чего-то? Если истина третья из причин, то что именно мне следует понять? |
|
|
|
Поиск в теме | Версия для печати |
Страниц (2): [1] 2 » |
Сейчас эту тему просматривают: 1 (гостей: 1, зарегистрированных: 0, скрытых: 0) |
« PHP/Perl » |
Все гости форума могут просматривать этот раздел. Только администраторы и модераторы могут создавать новые темы в этом разделе. Только администраторы и модераторы могут отвечать на сообщения в этом разделе.
|
|
|