Собираем вопросы авторам PHP - они ответят на PHPConf 2008

  • Автор темы Автор темы confguru
  • Дата начала Дата начала
Вопрос:
Когда будет:
PHP:
$a = function ($b) {echo $b('Hello World');}
$a(function ($string) {echo $string;});
? Было бы очень здорово жонглировать функциями, как в Javascript.
create_function не катит т.к. неудобно.

з.ы. т.е. надо добавить языковую обертку для create_function, помоему это очень нетрудно сделать, если задано имя функции то определяем его, а если оно пусто, т.е. function (), то возвращаем результат create_function().
 
WP
а зачем тебе это, в javascript это затычка
это больше напоминает eval
 
AmdY
create_function как раз и напоминает eval :)
а лямбда-функции - имхо вполне себе красивое средство.
 
про лямбда-функции Тони уже ответил на первой странице

send a patch or shut up вобщем =))
 
fixxxer
Ну дык это призыв к товарисчам разработчикам чтобы внесли в TODO.
 
кстати с лямбда-функциями все не так просто - это в текущей реализации, если я не ошибаюсь, и есть eval, соответственно, получаем постоянный запуск компилятора, отсутствие кэширования байткода акселератором - соответственно если сделать более удобный синтаксис но оставить как есть реализацию получаем проблемы с производительностью
 
$a(function ($string) {echo $string;});
А чем не устраивает [гораздо более разумный подход, ИМХО] следующее:

PHP:
<?php
$a('function_name_here');
?>

Можно и методы классов/объектов таким образом передавать как коллбэки...
 
зачем это, если можно function_name_here($a) , а главное function_name_here можно затем реиспользовать.
гораздо интереснее function_name_here($a)[0] или function_name_here($a), хотя это такой салат получится, что лучше не нужно.
 
по хорошему, если уж делать лямбда-функции, то надо делать и замыкания.
иначе смысла не так то много
 
мне недавно понадобился аналог автолоада для инклуда
было бы неплохо добавить мэджик include_/require
правда как я ни пытался объяснить Тони зачем оно мне - он так ни одного моего аргумента не посчитал достаточно весомым
(цель простая - пришлось немного поизвращаться над загрузчиком ZF при включении его в собственный фреймворк - все получилось, но если б был __include_once - было бы намного проще)
 
StUV
Даже несмотря на то, что ты описал свою цель - смысла в __include_once не увидел :(.
 
crocodile2u

Ну, стало быть, обратимся к источникам: http://ru2.php.net/manual/en/objaggregation.examples.php ... Что же мы видим?
товарищь простите но это бред.
Потому что перевод на русский язык того что написано в мануале я считаю такой:
Мы с этой ситуацией сделать ничего не можем. Вы конечно можете и если у вас нет проблем с тем что ошибка компиляции теперь станет для вас ошибкой логики нам то вобще пофигу
Исходя из этого я и говорю нет множественного наследования.

Товарищь, все что мы там увидили это решение которое мало удовлетворяет.

мало того что мы плодим лишний код в обоих вариантах.

так еще и наслаиваются проблемы связывания модулей и проверки типов данных.

придеться порядком подзамарочиться чтобы до инициализации объекта одного класса у вас всегда был загружен другой класс, другие десять классов
проверка при инициализации??? ну лишний еще код? так вот это не просто. видите ли
И как следствие еще один недостаток php: оператор new - всегда возвращает объект, хотя иногда бы хотелось чтобы при инициализации создавалась критическая ситуация, что мол нельзя сделать так чтобы был создан объект. мол ошибки при инициализации. тогда при отладки было бы проще отловить эту ситуацию.
Во втором примере нужно подзамарочиться чтобы объект передаваемый был обязательно объектом нужного класса. что опять написание лишнего кода. лишней проверки
 
Ну все ясно - пациент Rashkin неоперабелен. Скажи, дорогой друг, чего ты вообще вцепился в эти функции aggregate_* ??? Забудь про них. Вообще. Выкинь из головы. Этих функций нету. А агрегация - есть. И, несмотря на то, что множественного наследования в ПХП нет - его можно отлично сэмулировать, используя агрегацию и __call(). На сем все споры на данную тему я лично прекращаю как бессмысленные.

ЗЫ. ах, да... надо объяснить, почему я считаю пациента не подлежащим лечению:
1. не умеет читать.
2. приводит какие-то "переводы" непонятно откуда взявшихся текстов.
3. говорит о себе во множественном числе.
 
Ну если я должен ответить только на
Скажи, дорогой друг, чего ты вообще вцепился в эти функции aggregate_* ???
то в общем считаю это как бы по теме форума. Считаю что раз уж php5 и php4 так резко отличаются в сторону ООП то было бы не плохо и далее развивать эту линию.

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

спасибо за внимание
 
Вот надумал вопрос, только он не о высоком ООП
Очень хотелось бы иметь возможность залочить переменную, по подобию работы с файлами, чтобы на определённом этапе кода её нельзя было менять или считывать без разлочивания
Не знаю насколько это архитектурно красиво, но чертовски нужная штука при групповой разработке, особенно если исполнители некоторые - шибко умные студенты.

p.s. скачал, новый мануал, буду почитывать, а то я заметил. что всё, что нужно разработчики уже придумали, но иногда об этом ещё не знаешь
 
Rashkin
Ваши личные убеждения по тому что можно легко сэмулировать я ломать не собираюсь
Ну, конечно. У меня ведь есть отличный контр-аргумент при необходимости: 15-20 строчек кода.
Я считаю что есть вещи, которые не нужно было бы эмулировать, если бы изначально задуматься
Задумываться надо было раньше, читать/писать в @internals. И вот еще информация к размышлению: Java - один из самых продвинутых ОО-языков - не имеет множественного наследования. Смоллтолк (поправьте меня, если я ошибаюсь) - тоже... Думаешь, это просто так?

ЗЫ. про ошибки я вообще не понял, к чему сказано...
 
не понятно, если 2 родителя имеют одинковые имена и сигнатуры методов, то как определить, что будет в предке?(в плане пхп)
 
Java - один из самых продвинутых ОО-языков - не имеет множественного наследования.
давно уже хотел это написать. В С# тоже нет. Значит это не такая уж и необходимая функциональность.
 
почему до сих пор у нас нету всяких полезных типов данных типа питоновских tuple, set, list, ... ?
 
Сверху