[], конкатенация и notice

zerkms

TDD infected
Команда форума
[], конкатенация и notice

PHP:
$a = array();

$a[] .= 'foobar'; // case 1
Почему нет нотиса?
 

zerkms

TDD infected
Команда форума
PHP:
$a = array();

$a['asd'] .= 'foobar'; // case 2

$qwe .= 'baz'; //case 3
в чём концептуальная разница ситуации 1 (стартовый пост) и case 2 & 3?
 

tf

крылья рулят
элемент должен существовать, он создается
помоему приоритет операторов происходит, только вот смысла ноль
 

dimagolov

Новичок
An existing array can be modified by explicitly setting values in it.

This is done by assigning values to the array, specifying the key in brackets. The key can also be omitted, resulting in an empty pair of brackets ([]).
Ты к тому, что изначально элемент не существует? Видимо в начале вычисляется левый операнд, то есть при этом определяется индекс, и он получает значение NULL, после чего происходит конкатенация с правым операндом.
 

zerkms

TDD infected
Команда форума
dimagolov
tf
Ты к тому, что изначально элемент не существует? Видимо в начале вычисляется левый операнд, то есть при этом определяется индекс, и он получает значение NULL, после чего происходит конкатенация с правым операндом.
в том то и дело, что [] это не оператор. поэтому к нему нельзя применить приоритеты выполнения операторов и соответственно как не оператор он не может "вычислиться".

UPD: а.... или $a[] это выражение, которое и вправду вычисляется перед операцией .=
 

dimagolov

Новичок
zerkms, где это не оператор? это в исходниках синтаксического анализатора сказано что это не оператор? я исходники не смотрел, мне интересно. В незабвенном C++ его по-моему даже переопределять можно было. или он не оператор от того, что он из двух символов? так есть прецедент оператора в пхп из более чем одного символа (между которыми идут операнды).

а что касается почему case 1 без нотиса, когда 2 и 3 с ним, так применение [] без второго аргумента особый случай, типа неявная инициализация при любых раскладах, даже при обычном присваивании. видимо из-за этой химии с "неявностью" и душиться нотис.
 

zerkms

TDD infected
Команда форума
dimagolov
в списке операторов его нет: http://www.php.net/manual/en/language.operators.array.php
в списке приоритета выполнения операторов его тоже нет: http://www.php.net/manual/en/language.operators.precedence.php

в сорсы я не лазил, я в них слишком плохо ориентируюсь. так что для меня аксиоматична документация.

видимо из-за этой химии с "неявностью" и душиться нотис.
ну вот природа этой неявности мне и интересна :)

ps: код был получен и замечен случайно, в результате рефакторингов. естественно в $a[] .= 'asd'; никакого смысла и практической пользы нет.
 

dimagolov

Новичок
кстати да, прочитал твое дополнение про выражение, так наверное корректнее будет и оно таки вычисляется:
If a key is not specified for a value, the maximum of the integer indices is taken and the new key will be that value plus 1.
-~{}~ 18.08.09 22:06:

в списке приоритета выполнения операторов его тоже нет: http://www.php.net/manual/en/langua....precedence.php
как раз есть, во второй строчке :)
 

zerkms

TDD infected
Команда форума
[
??

почему интересно не []

-~{}~ 19.08.09 12:13:

ну тогда да, это всё меняет
 

dimagolov

Новичок
мне больше стало интересно почему там нету $, тоже ведь оператор по логике:
In order to use variable variables with arrays, you have to resolve an ambiguity problem. That is, if you write $$a[1] then the parser needs to know if you meant to use $a[1] as a variable, or if you wanted $$a as the variable and then the [1] index from that variable. The syntax for resolving this ambiguity is: ${$a[1]} for the first case and ${$a}[1] for the second.
 
Сверху