Забавный косячок PHP

Krishna

Продался Java
Забавный косячок PHP

Наверное, это дикий боян и скорее фича, чем баг, но я не знал ))

Я тут ковырялся в Доктрине, в одном из сабвершен билдов и поймал там интересную ошибку.
Оказываецца на такой вот код:
PHP:
<?php
function test($x, $x)
 {
  echo $x;
 }

test(1,2);
?>
пых абсолютно не обижается, никак не ругается даже при E_STRICT и выводит "2".

А самое смешное, что такую ошибку я нашел в одном из методов Доктрины, причем пых ругнулся, но не на метод с одноименными параметрами, а на то, что интерфейс этого метода не совпадал с методом базового класса, который перегружался в наследуемом. %)
 

Krishna

Продался Java
berkut
Ну да, я и не сомневался, что через func_get_args() можно получить, хотя проверять не стал)

Но всё же, мне кажется компилятор должен ругаться на такие вещи. Ведь это совершенно явная опечатка.
 

Long

Новичок
ну если вспомнить что расказывал Дерик на phpConf 2007 про то как храняться/передаются php-переменные - ничего удивительного нет.
посему - не плохая задачка для собеседования ;)
 

Krishna

Продался Java
Wicked
Почему нет?

Long
Правда чтоли??
И как же они "хранятся/передаються"?
И какое это имеет отношение к вышеуказанному косячку?
Просим!

З.Ы. Даю подсказку, башлять бабло на пхпконф2007 было совершенно необязательно, чтобы ознакомиться с откровениями Дерика на эту тему ;)
 

Long

Новичок
Krishna мне кажется ты уже большой мальчик и знаешь, где можно найти "как они хранятся/передаются" :)
 

Krishna

Продался Java
Long
А мне кажется, что как бы они не хранились, это совершенно не объясняет то, что пых не делает проверку уникальности текущих идентификаторов :)

Причём, наверняка можно было сделать исключение для пользовательских массивов.

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

Long

Новичок
Krishna, а ты хотел от меня объяснений почему не делается проверка? ну это не ко мне... я могу лишь предположить что это связано со слабой типизацией в PHP.
 

WP

^_^
Я думаю всё правильно, и косяка нету. PHP назначает значения аргументов из массива соответствующим переменным из списка объявленных аргументов. Разумеется происходит перезапись и ничего страшного.

-~{}~ 21.05.08 16:02:

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

phprus

Moderator
Команда форума
WP
и вообще меня умиляют такие топики... если бы везде были проверки, знаете как бы это все тормозило? имхо чем меньше ненужных проверок тем лучше.
Разумно сделанные проверки не тормозят. А оптимизировать нужно только то, что тормозит. При том определить эти узкие места можно только эксперементально.
 

WP

^_^
А что такое "не тормозят"? На них требуются определенные ресурсы в любом случае, и в совокупности они дают тормоза. Тысяча проверок пусть по 0.1 мс, это уже 100 мс, а это дофига. Хотя 0.1 мс операция копеечная.
 

Bakti9rov

!*|=?
я могу лишь предположить что это связано со слабой типизацией в PHP.
какая связь между: слабая типизация - имена параметров??

покопался в Zend_API.c - там параметры вообще в виде массива хранятся (навроде "zval** args") - поэтому через func_get_args() их легко можно получить :)

когда в функцию приходят сами значения параметров (фактические параметры), РНР что делает: подсчитывается их количество и сверяет с прототипом; создает лок переменные; когда параметр не пришел по ссылке (& $x) - выделяет нужную память; заполняет значения (а где надо - подставляются дефолты). Но НИКАК не проверяет имена параметров - он их использует только чтобы достать переменную(или создатиь новую), получить оттуда/или записать туда значение.
 

Angerslave

Новичок
WP
Думаю, меньше 0,1 мс, к тому же это только на этапе парсинга должно выполняться, то есть оптимизироваться на ура. Думаю тут больше не в целях оптимизации, сколько просто не додумались, что кто-то может объявить 2 разных аргумента функции одним именем...
 

iamFake

Mind Of Liberty
имхо данная проблема относится не столько к php(хотя от части и относится), сколько к внимательности программиста... ведь как минимум тупо осознанно делать такое объявление "test($x, $x)"
 
Сверху