Strict Standards: Resource ID#18 used as offset, casting to integer (18) in /home/tvoyweb/domains/tvoyweb.ru/public_html/forums/include/fm.class.php on line 401

Strict Standards: Resource ID#23 used as offset, casting to integer (23) in /home/tvoyweb/domains/tvoyweb.ru/public_html/forums/include/fm.class.php on line 401

Strict Standards: Resource ID#25 used as offset, casting to integer (25) in /home/tvoyweb/domains/tvoyweb.ru/public_html/forums/include/fm.class.php on line 401

Strict Standards: Resource ID#26 used as offset, casting to integer (26) in /home/tvoyweb/domains/tvoyweb.ru/public_html/forums/include/fm.class.php on line 401
ТвойWeb :: Сложные конструкции в PHP
ТвойWeb ТвойWeb
Качественный Европейский хостинг
Форум для чайников
 Чат на форуме      Помощь      Поиск      Пользователи


 Страниц (2): [1] 2 »   

> Описание: Или не очень сложные...
Furax
Отправлено: 26 Апреля, 2007 - 04:10:05
Post Id



Бледнотик


Покинул форум
Сообщений всего: 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 уже чресчур сложны?
 
 Top
Jakeryf
Отправлено: 26 Апреля, 2007 - 20:25:20
Post Id



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']." написал:";
?>
 
 Top
Furax
Отправлено: 27 Апреля, 2007 - 01:15:10
Post Id



Бледнотик


Покинул форум
Сообщений всего: 1472
Дата рег-ции: Март 2007  
Откуда: Иркутск, Сибирь, СССР

Карма 32




Jakeryf
Такие конструкции с успехом идут в таких языках, как C, C++ и JavaScript, где можно обращаться к элементу массива, возвращаемого любым выражением. Очевидно, в PHP это не так? Странно, я почему-то думал, что идеология выражений применяется во всех современных языках... О том и спрашиваю.

О способе с конкатенацией я знаю, меня интересовал именно inline...
 
 Top
Jakeryf
Отправлено: 27 Апреля, 2007 - 01:21:12
Post Id



Junior Member


Покинул форум
Сообщений всего: 56
Дата рег-ции: Нояб. 2006  
Откуда: Барнаул

Карма 2




Furax пишет:
Такие конструкции с успехом идут в таких языках, как C, C++ и JavaScript

покажи мне рабочий пример на Cи и JavaScript
 
 Top
Ray Wen Администратор
Отправлено: 27 Апреля, 2007 - 01:50:58
Post Id



Собиратель шишек...


Покинул форум
Сообщений всего: 2602
Дата рег-ции: Янв. 2005  
Откуда: Волгоград

Карма 21




Furax
Furax пишет:
$data=getArray()[0];

Подобной конструкции точно нету ни в одном из языков... Каким образом можно поставить [0] к функции? Это ведь не массив...

Furax пишет:
print "Пользователь $users[1][nickname] написал:";

Строковые переменные должны быть в скобках...
Jakeryf пишет:
print "Пользователь ".$users[1]['nickname']." написал:";


В общем нужно лишь изучить грамматику...
 
 Top
Furax
Отправлено: 27 Апреля, 2007 - 09:27:45
Post Id



Бледнотик


Покинул форум
Сообщений всего: 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. Или исходники почитать...

Значит, в строку может быть непосредственно внедрена или строковая переменная, или, максимум, массив строковых элементов единичной глубины? Грустно...
 
 Top
Jakeryf
Отправлено: 27 Апреля, 2007 - 10:47:28
Post Id



Junior Member


Покинул форум
Сообщений всего: 56
Дата рег-ции: Нояб. 2006  
Откуда: Барнаул

Карма 2




Furax
<?php
function getArray()
{
return array('Полезные данные', 'Всякая чушь...'Подмигивание;
}

$data=getArray()[0];
?>

ты мне вот такую конструкцию напиши на JavaScript и Си


CODE:
...
<body onload="document.getElementsByTagName('h1')[0].innerHTML='Добро пожаловать!';">
<h1>Загрузка страницы...</h1>
...


это немного не то что ты написал. Ты мне напиши со своей функцией и желательно на Си, мне просто интересно.
Furax пишет:
как C++ и написанный по его образу и подобию JavaScript


по подобию С++ является язык Java, но назвать JavaScript назвать Cи подобным можно с трудом.
Зы РНР тоже является Си подобным языком.
 
 Top
Furax
Отправлено: 28 Апреля, 2007 - 02:23:57
Post Id



Бледнотик


Покинул форум
Сообщений всего: 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 меня за них ругает? Является ли это следствием другой идеологической основы этого языка, простой недоработкой в интерпретаторе или всё же следствием моего недопонимания чего-то? Если истина третья из причин, то что именно мне следует понять?
 
 Top
Jakeryf
Отправлено: 28 Апреля, 2007 - 03:48:51
Post Id



Junior Member


Покинул форум
Сообщений всего: 56
Дата рег-ции: Нояб. 2006  
Откуда: Барнаул

Карма 2




Furax
спасибо что все объяснил
 
 Top
Ray Wen Администратор
Отправлено: 28 Апреля, 2007 - 04:20:52
Post Id



Собиратель шишек...


Покинул форум
Сообщений всего: 2602
Дата рег-ции: Янв. 2005  
Откуда: Волгоград

Карма 21




Furax
Просто как и во всех языках есть свои правила написания... Найди инфу, благо её много и не гадай где и чего нужно вставлять... Уж в работе с массивами никаких сложностей в PHP нет и по возможностям никак не скромнее JS...
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 1 (гостей: 1, зарегистрированных: 0, скрытых: 0)
« PHP/Perl »


Все гости форума могут просматривать этот раздел.
Только администраторы и модераторы могут создавать новые темы в этом разделе.
Только администраторы и модераторы могут отвечать на сообщения в этом разделе.
 



Форум на AlfaSpace.NET


Powered by ExBB
ExBB FM 1.0 RC1 by TvoyWeb.ru
InvisionExBB Style converted by Markus®

[Script Execution time: 0.04]     [ Gzipped ]



Notice: ob_end_flush(): failed to send buffer of ob_gzhandler (1) in /home/tvoyweb/domains/tvoyweb.ru/public_html/forums/include/page_tail.php on line 33