| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > PHP: Общие вопросы > Как сделать свою суперглобальную переменную? |
| Автор: animegirl 15.3.2013, 08:12 | ||||
| Что я нагуглила: http://www.php.net/manual/en/runkit.configuration.php Если верить описанию, то добавив такого рода строчки в php.ini
можно будет использовать массив $_TESTT как суперглобальную переменную, однако, код:
выдаёт ошибку: Notice: Undefined variable: _TESTT in /var/www/way.way/public/test.php on line 5 Где я не так поняла мануал? |
| Автор: ksnk 15.3.2013, 09:14 | ||
http://www.php.net/manual/ru/runkit.installation.php
|
| Автор: Gold Dragon 15.3.2013, 13:22 | ||||||||||
я использую что-то подобное.. и глобально и доступно и всё моё
а вот как использую
ну или простое использование с собственным контролем что и как хранить
или как в вопросе
|
| Автор: animegirl 17.3.2013, 05:31 | ||
ksnk,
Что такое CVS? |
| Автор: MoLeX 17.3.2013, 11:30 |
| animegirl, бан в гугле? http://ru.wikipedia.org/wiki/CVS |
| Автор: animegirl 17.3.2013, 18:38 |
| MoLeX, Я просто не поняла, что делать в итоге :( |
| Автор: Fortop 17.3.2013, 21:38 |
| animegirl, лучше не делать. Зачем тебе эта суперглобальная переменная? Добавлено @ 21:39 собирать модуль и ставить его руками. |
| Автор: animegirl 17.3.2013, 21:42 |
| Да надоело в каждой функции прописывать список всего что надо, чисто эстетический вид и простота в чтение кода. Да там одно и тоже, что с подчёркиванием, что без него, нужно ставить модуль, а он не встанет на новый ПХП, а разрабочица этого модуля забила на ПХП так как ушла работать в файсбук :( |
| Автор: animegirl 18.3.2013, 00:49 |
| Ну просто много функций, где нету результата типа false/true а какие-нибудь данные возвращаются, хочется это межскриптно упорядочить. |
| Автор: Fortop 18.3.2013, 01:24 | ||||
Почему эти данные не могут возвращаться из функции? Зачем их обязательно передавать через суперглобальные переменные?
|
| Автор: animegirl 18.3.2013, 01:25 |
| Для удобства, не более и не менее |
| Автор: Fortop 18.3.2013, 01:29 |
| animegirl, Если только для удобства, то и пользуйтесь $GLOBALS Добавлено через 53 секунды Но в целом, ограничение области видимости для возвращаемых результатов дает много больше удобства. И чем крупнее программа, тем неудобнее суперглобальные переменные |
| Автор: animegirl 18.3.2013, 01:50 |
| Fortop, Была такая мысль, но ведь если найти багу для инжекта, его можно вывести дампом, по этому хотелось переменную свою ) |
| Автор: Fortop 18.3.2013, 03:14 | ||||
Кто помешает вывести эту самую "свою"?
|
| Автор: animegirl 18.3.2013, 03:15 |
| Ясно, значит $_GLOBALS |
| Автор: Gold Dragon 18.3.2013, 07:27 |
| animegirl, а чем тебе не понравился мой класс? Это и есть "глобальная переменная" |
| Автор: animegirl 18.3.2013, 07:30 |
| Gold Dragon, Я пока, что до классов не доросла, пытаюсь избегать этого типа программирования, пока не прижмёт, а нето будет как всегда, сначала не понимаешь и злишься, а потом нравится и убиваешь уйму времени, чтоб всё переделать на новый лад. |
| Автор: Gold Dragon 18.3.2013, 08:18 |
| animegirl, ну в данной ситуации, тебе просто нужно его подключить в самом начале и ты получишь возможность управлять своей "глобальной переменной". Примеры как использовать я показал. А про Глобальные переменные забудь.. Получила данные из глобальной, присвоила их переменной и уже дальше работай со своими переменными. И использование global в функциях это тоже зло.. Не ленись передавать функциям параметры и возвращать их. |
| Автор: ksnk 18.3.2013, 09:29 | ||
А сейчас будет не так? |
| Автор: MoLeX 18.3.2013, 10:20 | ||
мне больше нравится использовать возможности 5.4 и без использования классов
для версии ниже 5.4 последние два способа будут не доступны (GL()['var1'], GL()['array']['key']) |
| Автор: IgorIV 18.3.2013, 18:55 | ||
Я так думаю, что надо привести пример функции которая показывает " список всего, что надо". Может ошибка в подходе? А вот про модуль не понял |
| Автор: animegirl 19.3.2013, 16:05 |
| Ситуация, такова, у меня на каждую функцию проекта, свой ПХП файл. Есть 2-3 файла инклуда с основными функциями и вариаблами. Функции очень сильно перемешаны друг с другом, каждый раз для вызова, чего-то нового, нужно передавать кучу вариабл,. Если я хочу добавить новую вариаблу, то мне приходится в каждом из 100+ ПХП файлов добавить эту вариаблу к вызовам функции, хотя её спокойно, можно создать в обработки другой функции, и оставить в глобальных. Я сейчас перешла на $GLOBALS, минут за 30 перевела все скрипты на новый способ общения, и в принципе очень даже рада. Вносить изменения стало намного легче. По поводу модуля. Модуль упомянутый выше runkit писался девушкой для PHP, но она перестала его обновлять, так как её утянули работать в фэйсбук, последния версия модуля датируется 2006ым годом, и он не работает с PHP 5.2+ :( |
| Автор: Aliance 19.3.2013, 16:26 | ||
|
| Автор: Fortop 19.3.2013, 17:06 | ||
Это указывает на ошибку в разработке самих функций. Выделение кода в функцию производится по двум признакам - повторяемость и специализация. Т.е. выделяемый код должен выполнять некие специализированные действия и/или повторятся неоднократно Таким образом в функцию совсем не нужно передавать огромную кучу переменных (в силу того что она выполняет не слишком сложные действия) Функция даже с 5тью обязательными параметрами достаточно сложна. Если у вас есть большее количество параметров, то скорее всего они поддаются группировке, а значит вы можете передавать несколько объектов или массивов вместо сотен параметров. |
| Автор: IgorIV 19.3.2013, 17:42 |
| animegirl, как вы там пишете? |
| Автор: animegirl 19.3.2013, 18:15 | ||||
| IgorIV, script.php
stats.inc
Это часть кода, часть функции write_log, вариабла $GLOBALS['run_time'] ещё используется там не однократно. Это один из примеров, не хочется без надобности постить сюда кучу своего кода |
| Автор: animegirl 19.3.2013, 18:45 |
| Другой пример (без кода). У меня используются несколько разных соединений с базой, отправка запросов делается через 2 разные функции, каждая из которых: 1. Проверяет существует ли уже соединение для её типа, если нет создаёт 2. Отправляет sql запрос по правильному каналу, если запрос не проходит создаёт репорт ошибки в файл Если оставить вариант, с передачей переменных, то их надо сначала создавать, потом передавать, а так функции становятся более автономными, что уменьшает возможность ошибки при неправильном описании их вызова. Меньше шансов на ошибку -> меньше потраченного времени, на её поиск. |
| Автор: Fortop 19.3.2013, 19:13 | ||||
меняем на такой код в write_log();
можно даже на такое
Что мы имеем? Теперь нам неважно установлена ли $GLOBALS['script_name'] в вызывающем скрипте и правильно ли она установлена. Мы сами можем узнать откуда нас - write_log() вызвали. |
| Автор: animegirl 19.3.2013, 19:18 | ||||||||
Fortop,
выдаёт
выдаёт
|
| Автор: Fortop 19.3.2013, 19:33 | ||||||||
Версия php у тебя меньше 5.4
Вызываешь debug_backtrace() напрямую вне функции или подключаемого файла. Поэтому стектрейса нет. Для таких случаев можно добавить подобную проверку
Добавлено через 2 минуты и 9 секунд для получения времени работы можно пользоваться или xhproof Он запишет не только время выполнения каждого запуска скрипта, но и время выполнения отдельных функций в скрипте В самом же скрипте можно использовать getrusage()
Добавлено через 2 минуты и 58 секунд т.е. вместо того чтобы возится самому с вычислением времени и прочего - мы поручаем эту работу профайлеру и/или системе. Сами лишь пользуемся той информацией, которую они нам дают. |
| Автор: animegirl 19.3.2013, 19:58 | ||
То есть перелопатить все 100+ файлов на добавление этой строчки, а потом каждый раз когда захочу подправить, что-то опять все файлы править, разве не для этого функции придумали? Спасибо за функцию getrusage(), надо будет глянуть, что она может. Ну и как я уже написла, это только часть лога ) Для статистики по MySQL тоже есть команды готовые? |
| Автор: IgorIV 19.3.2013, 22:45 | ||
animegirl,
Как-то так, особо не ломая код. |
| Автор: animegirl 19.3.2013, 22:49 |
| IgorIV, Замысел был красив, но я это уже проходила, чуток в другой форме, но всё равно, в $file запишется stats.inc |
| Автор: Fortop 19.3.2013, 23:02 | ||||
Зачем лопатить? Я же тебе показал в write_log() дописываешь код с debug_backtrace() Естественно без echo, а так как тебе нужно - т.е. с прочтением в локальную переменную и используешь ее вместо своего GLOBALS И тебе больше не нужно будет прописывать
|
| Автор: animegirl 19.3.2013, 23:06 |
| Fortop, И результат будет тот же, что и у Игоря, и что у меня два дня назад, если вызывать debug_backtrace() либо __FILE__ внутри stat.inc то выдадут они в итоге stat.inc а не то скрипт, который надо отследить. Я даже предположу, что debug_backtrace() сам использует __FILE__ |
| Автор: Fortop 19.3.2013, 23:43 | ||||
Что за тупые предположения? animegirl, debug_backtrace содержит имена всех методов которые были вызваны чтобы добраться до текущего участка кода Там есть намного больше того, что может тебе подуматься.
|
| Автор: animegirl 20.3.2013, 00:06 | ||
| Fortop, Каюсь, не посмотрела, выдачу всего массива, попробовала из файла stat.inc
Выдаёт index.php как и надо, но если перенести эти строки в другой инклуд файл, то всё смещается, на позиции 0 встаёт stat.inc а index.php уходит на позицию 1. И как теперь там искать нужное, если $GLOBALS['script_name'] используется в разных местах? |
| Автор: Fortop 20.3.2013, 01:41 | ||
Как определяется его нужность? Чем определяется логика его установки? Первый скрипт, который собственно был запущен? Массив работает по принципу стека. 0й элемент - ближайший вызов Последний элемент - первый вызов Через сколько бы include у вас мой код не вызвался. |
| Автор: animegirl 20.3.2013, 01:49 | ||||||||
| Fortop, a.php
b.php
c.php
=
|
| Автор: Fortop 20.3.2013, 01:52 |
| В чем вопрос? |
| Автор: animegirl 20.3.2013, 01:59 |
| Fortop, В том, что a.php (забыла упомянуть, что выдача с него), не в [0] |
| Автор: Fortop 20.3.2013, 02:08 | ||||||
Как это выглядит когда файлов больше 10ти я показывал выше http://forum.vingrad.ru/index.php?showtopic=363764&view=findpost&p=2554174 Где был вызыван debug_backtrace()
А это собственно файл к которому мы обратились самым первым
|
| Автор: IgorIV 20.3.2013, 20:20 | ||||||||||||
Посмотри вывод
b.php
c.php
animegirl.php
|
| Автор: IgorIV 20.3.2013, 20:58 |
| Но мне кажется я не понял задачу? Время выполнения какого скрипта интересует? |
| Автор: animegirl 20.3.2013, 22:16 | ||
| IgorIV, Главного, спасибо за помощь, мы вчера в глубокой ночи, всё-таки нашли решение:
|
| Автор: Fortop 20.3.2013, 23:27 |
| animegirl, ну ад же debug_backtrace() тебе нужен только в самой функции лога. Зачем ты его результат пишешь в GLOBALS? |
| Автор: animegirl 21.3.2013, 00:10 |
| Fortop, У меня несколько функций для сбора разных логов по надобности |
| Автор: IgorIV 22.3.2013, 20:14 | ||
Я так и думал, а должна быть одна,ну две. Нужно активно пользоваться возможностью передавать в функцию параметры. А что же тогда с классами будет? Твой пример прмерно должен выглядеть так. Не нало писать в функциях конкретные вещи - путь, название файла, текст.
|