kakserpom / phpdaemon

Asynchronous server-side framework for network applications implemented in PHP using libevent
http://daemon.io/
GNU Lesser General Public License v3.0
1.53k stars 231 forks source link

namespace nightmare #165

Closed andrey-oparin closed 10 years ago

andrey-oparin commented 10 years ago

Стандартные функции PHP переопределяются в пространстве имен PHPDaemon\Thread

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

runkit_function_rename('PHPDaemon\Thread\header', 'header'); runkit_function_rename('PHPDaemon\Thread\headers_sent', 'headers_sent'); runkit_function_rename('PHPDaemon\Thread\is_uploaded_file', 'is_uploaded_file'); runkit_function_rename('PHPDaemon\Thread\move_uploaded_file', 'move_uploaded_file'); runkit_function_rename('PHPDaemon\Thread\is_uploaded_file', 'is_uploaded_file'); runkit_function_rename('PHPDaemon\Thread\headers_list', 'headers_list'); runkit_function_rename('PHPDaemon\Thread\setcookie', 'setcookie'); runkit_function_rename('PHPDaemon\Thread\register_shutdown_function', 'register_shutdown_function'); runkit_function_rename('PHPDaemon\Thread\create_function', 'create_function');

..........................................................

namespace PHPDaemon\Thread;

/**
 * Overrides native PHP functions.
 * @return void
 */
protected function overrideNativeFuncs() {
    if (Daemon::supported(Daemon::SUPPORT_RUNKIT_INTERNAL_MODIFY)) {

        runkit_function_rename('header', 'header_native');

        function header() {
            if (!Daemon::$context instanceof \PHPDaemon\Request\Generic) {
                return false;
            }
            return call_user_func_array([Daemon::$context, 'header'], func_get_args());
        }
kakserpom commented 10 years ago

Пришлёте pull request? ;-)

andrey-oparin commented 10 years ago

мне не удалось исправить проблему непосредственно в вашем модуле, вместо этого использую описанный хак в моем приложении, могу привести пример наследника AppInstance

andrey-oparin commented 10 years ago

Чтобы воспроизвести проблему с пространством имен при обращении к стандартным функциям, переопределяемым в методе overrideNativeFuncs(), достаточно заменить вызов $this->header('Content-Type: text/html') на header('Content-Type: text/html') в любом из примеров в каталоге Examples. При этом возникнет ошибка Call to undefined function header(), так как функция header переопределена в пространстве имен PHPDaemon\Thread, и для корректного вызова приходится использовать пространство имен PHPDaemon\Thread\header('Content-Type: text/html')

andrey-oparin commented 10 years ago

нужно сделать так чтобы стандартная функция header была доступна в глобальном пространстве имен без использования хака вида runkit_function_rename('PHPDaemon\Thread\header', 'header');

kakserpom commented 10 years ago

Ну как, всё работает?

andrey-oparin commented 10 years ago

После исправления приложение вылетает с ошибкой Unexcepted shutdown

andrey-oparin commented 10 years ago

Я исправил проблему, при попытке сделать push в ветку andrey.oparin/namespacebug получаю ошибку:

Permission to kakserpom/phpdaemon.git denied to andrey.oparin@gmail.com.

kakserpom commented 10 years ago

Вы не туда пушите.

andrey-oparin commented 10 years ago

куда нужно пушить ?

kakserpom commented 10 years ago

Ну очевидно в свой репозиторий, а не в основной. А дальше pull request.

nizsheanez commented 10 years ago

Пока все плохо:

PHP Parse error:  syntax error, unexpected '\' (T_NS_SEPARATOR), expecting '(' in 
vendor/kakserpom/phpdaemon/PHPDaemon/Thread/Worker.php on line 263

php -v 5.5.9

и PHPStorm ругается на несовпадающую сигнатуру header

andrey-oparin commented 10 years ago

Очень странно, у меня все работает. Пока откатите попробую немного по другому исправить. Или исправьте сами, суть в том что нужно функцию overrideNativeFuncs() выделить в корневой namespace как в моем примере. Переопределение стандратных функций с префиксом \ внутри пространства имен PHPDaemon\Thread не решает проблему.

kakserpom commented 10 years ago

А в чем проблема с переименованием? Из \PHPDaemon\Thread в . Не работает?

18 февраля 2014 г., 7:45 пользователь andrey-oparin < notifications@github.com> написал:

Очень странно, у меня все работает. Пока откатите попробую немного по другому исправить. Или исправьте сами, суть в том что нужно функцию overrideNativeFuncs() выделить в корневой namespace как в моем примере. Объявление функций с префиксом \ внутри пространства имен PHPDaemon\Thread\header не решает проблему.

Reply to this email directly or view it on GitHubhttps://github.com/kakserpom/phpdaemon/issues/165#issuecomment-35349991 .

nizsheanez commented 10 years ago

@kakserpom У меня на php 5.5.9 упало с

PHP Parse error:  syntax error, unexpected '\' (T_NS_SEPARATOR), expecting '(' in 
vendor/kakserpom/phpdaemon/PHPDaemon/Thread/Worker.php on line 263
kakserpom commented 10 years ago

Черт, всё понятно, просто в git не попали нужные изменения. Глядите теперь, запушил.

nizsheanez commented 10 years ago

У меня работает

kakserpom commented 10 years ago

andrey-oparin: извините что так вышло, реально не запушилось у меня сначало, поэтому так долго баг исправлялся по факту.

andrey-oparin commented 10 years ago

спасибо за исправление