namespace, определение функции в методе и вызов этой функции

apt-get_mebeer

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

Есть класс A, в его методе getType() пишу вот такой код

PHP:
<?php

namespace API

class A {
   public function getType() {
         function future($card){
                return $card['future'];
         }
         $past_feed = array_filter($feed, "future");
   }
}
Помогите понять почему это плохо? Я понимаю, есть лямбда функции, но такой код? Именно чем он плох... Дело в том что это очень старый код и после того как я начал все переводить в PSR-4 у меня после добавления к данному классу пространства имен, код выше перестал работать.
 

AnrDaemon

Продвинутый новичок
И вы ещё спрашиваете, чем он плох?… Как минимум тем, что он не работает…
 

fixxxer

К.О.
Партнер клуба
после добавления к данному классу пространства имен, код выше перестал работат
А без namespace вот точно такой же код работает? Как интересно, можно посмотреть на этот код?

UPD: ох##ть, работает. PHP, вашу ж мать!
UPD2: Ну только при первом вызове, каэш =)
 

Hello

Новичок
@apt-get_mebeer,
  1. функция future может уже существовать
  2. $feed появлсяется неоткуда
  3. $feed может не быть массивом
  4. Может отсутствовать ключ future
 

apt-get_mebeer

Новичок
А без namespace вот точно такой же код работает? Как интересно, можно посмотреть на этот код?

UPD: ох##ть, работает. PHP, вашу ж мать!
UPD2: Ну только при первом вызове, каэш =)
Да да, именно работает. Вот и прошу объснить. Видимо человек торопился когад писал такое... Но код рабочий, откатил сейчас ветку все работает =)
 

apt-get_mebeer

Новичок
@fixxxer,
А без namespace вот точно такой же код работает? Как интересно, можно посмотреть на этот код?

UPD: ох##ть, работает. PHP, вашу ж мать!
UPD2: Ну только при первом вызове, каэш =)
Вот собственно еще кусок кода, точно такой же

Код:
        function cmp($a, $b){
            return $a['delta'] < $b['delta'];
        }

        if(count($org)) {
            usort($org, "cmp");

            //convert to array
            foreach ($org as $item) {
                $org_array[] = $item;
            }
        }
Да этот кусок кода это отдельный метод обычного класса. Класса БЕЗ namespace. Как только добавлю namespace все отваливается. Видимо я не достаточно понимаю работу компилятора.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
А без namespace вот точно такой же код работает? Как интересно, можно посмотреть на этот код?

UPD: ох##ть, работает. PHP, вашу ж мать!
Ну оно проваливается насквозь же, в глобальную область видимости. Такое поведение уже очень давно же, уже неск. раз обсуждали вроде.
 

apt-get_mebeer

Новичок
Ну оно проваливается насквозь же, в глобальную область видимости. Такое поведение уже очень давно же, уже неск. раз обсуждали вроде.
То есть получается, весь функционал класса видет только в пространстве A, но вот код который создает функции внутри метода этого класса создает их в глобальном пространстве?
Я поискал на форуме подобное, что то не смог найти. Если не сложно, можно ссылку. Спасибо за ответ
 

флоппик

promotor fidei
Команда форума
Партнер клуба
То есть получается, весь функционал класса видет только в пространстве A, но вот код который создает функции внутри метода этого класса создает их в глобальном пространстве?
Я поискал на форуме подобное, что то не смог найти. Если не сложно, можно ссылку. Спасибо за ответ
http://php.net/manual/ru/functions.user-defined.php - пример #3 и текст ниже него объясняет, почему это работает так. Это довольно древняя херь, оставленная для поддержки обратной совместимости, насколько понимаю.
 

Вурдалак

Продвинутый новичок
Как только добавлю namespace все отваливается
Потому что namespace распространяется на определение функций. В строковом варианте нужно всегда указывать имя с полным неймспейсом. Т.е. с array_filter($feed, "API\\future") должно заработать.
 

apt-get_mebeer

Новичок
Потому что namespace распространяется на определение функций. В строковом варианте нужно всегда указывать имя с полным неймспейсом. Т.е. с array_filter($feed, "API\\future") должно заработать.
Вурдалак, работает. Всем спасибо за ответы и помощь, невнимательность.
 

fixxxer

К.О.
Партнер клуба
@fixxxer,

Вот собственно еще кусок кода, точно такой же.
Это сработает только при первом вызове метода, а на второй будет ошибка "функция с таким именем уже определена".
Нафиг тебе такое?

http://php.net/manual/ru/functions.user-defined.php - пример #3 и текст ниже него объясняет, почему это работает так. Это довольно древняя херь, оставленная для поддержки обратной совместимости, насколько понимаю.
Ну в php4 я такое помню, но почему-то думал, что давно выпилили. Бред полный же.
 

apt-get_mebeer

Новичок
Это сработает только при первом вызове метода, а на второй будет ошибка "функция с таким именем уже определена".
Нафиг тебе такое?


Ну в php4 я такое помню, но почему-то думал, что давно выпилили. Бред полный же.
Ну слушай, мне это захотелось понять, данные куски кода уже выпилиены, пока что в хелпер.
 
Сверху