За последние 24 часа нас посетили 31053 программиста и 1450 роботов. Сейчас ищут 911 программистов ...

Выполнить функцию из терминала

Тема в разделе "PHP для новичков", создана пользователем bikerlex, 14 сен 2016.

  1. bikerlex

    bikerlex Активный пользователь

    С нами с:
    2 дек 2014
    Сообщения:
    344
    Симпатии:
    40
    Хочу запилить частичное управление приложением из терминала. И что-то не могу нарыть инфы по выполнению функций.
    Например есть файл test с печатью строки
    PHP:
    1. print 'test string';
    Из терминала строка печатается командой
    Код (Text):
    1. php test
    Если обернуть печать строки в функцию
    PHP:
    1. function println() {
    2.     print 'test string';
    3. }
    то команда выше не с работает, надо запустить функцию.
    И вот как эту функцию в терминале запустить что-то не могу нарыть.
     
  2. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    хм... а как она должна сработать то, если её ни кто не вызывает? )

    Вообще, для написания консольных тулз лучше всего воспользоваться пакетом вроде symfony/console. Там сразу будет и удобная работа с параметрами и хитрый вывод, вплоть до табличек и прогрессбаров.
     
  3. bikerlex

    bikerlex Активный пользователь

    С нами с:
    2 дек 2014
    Сообщения:
    344
    Симпатии:
    40
    Вот я и хочу знать как её вызвать. =)
    Можно так
    PHP:
    1. function println() {
    2.     print 'test string';
    3. }
    4. println();
    Но это не вариант, функций будет несколько и надо вызывать конкретную по имени например.
    Спасибо, почитаю.
     
  4. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.814
    Симпатии:
    1.332
    Адрес:
    Лень
    print использовать как обычный вывод инфы, а echo тогда зачем? 3 года назад мне так же сказали + echo (4 букав )
     
  5. bikerlex

    bikerlex Активный пользователь

    С нами с:
    2 дек 2014
    Сообщения:
    344
    Симпатии:
    40
  6. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Обычный print больше ничего и не умеет. Это эдакий echo для тех, кто пришел в php со всяких С. Только он не умеет выводить пачку данных через запятую и накой-то хрен всегда возвращает единицу.
     
  7. bikerlex

    bikerlex Активный пользователь

    С нами с:
    2 дек 2014
    Сообщения:
    344
    Симпатии:
    40
    Да. =) Я Джаву изучаю, и там часто вывожу в консоль результат разными методами print.. И поскольку здесь вывод в консоль, то меня как-то передергивает использовать здесь echo, хотя разницы то никакой. =) Вывод в браузер только echo.
     
  8. bikerlex

    bikerlex Активный пользователь

    С нами с:
    2 дек 2014
    Сообщения:
    344
    Симпатии:
    40
    Нашел способ вызвать функцию.
    Код (Text):
    1. php -r "require 'test'; println();"
    Но это херня. Длинная неудобная команда.

    Есть решение проще
    PHP:
    1. if(function_exists( $argv[1] )) {
    2.     call_user_func_array($argv[1], $argv);
    3. }
    4.  
    5. function println() {
    6.     print "test one";
    7. }
    8.  
    9. function println2() {
    10.     print "test two";
    11. }
    Вот так уже можно вызывать функцию передовая в качестве второго аргумента имя функции (первый аргумент это всегда имя файла).
    Код (Text):
    1.  
    2. php test println
    3. php test println2
     
    #8 bikerlex, 14 сен 2016
    Последнее редактирование: 14 сен 2016
  9. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Никакого "вывода в консоль" в реале не существует. У тебя пхп-машина, будучи обычно программой, при своём старте от системы получает три обязательных файловых дескриптора - ввод, вывод и ошибки. В режиме обработки веб-запроса - веб-сервер запишет на вход нужные данные, все твои эхи, принты, принтфы и так далее - пойдут в выходной поток (с некоторыми оговорками на буферизацию), а мат на рукожопого программиста - в ошибки. Веб-сервер и/или сама пхп-машина еще дополнительно над выходными потоками - выход и ошибки - пошаманят и выплюнут результат в виде ответа на запрос.

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

    Но самое важное тут это понимание того, что скрипт у тебя не поменялся. Поменялся только сапи и его окружение. Если ты пишешь функция имя(аргумент){печать строки;} то ты получишь одинаково пустой результат как при веб-запросе так и при запуске в консоли. Потому что ты декларировал функцию, но не вызывал её.

    Кстати, в консольниках очень удобно как раз таки пользоваться и выводом и ошибками. Можно через банальный fwrite(STDOUT или fwrite(STDERR задать в какой именно из этих двух потоков ты хочешь залупить данные.
     
  10. bikerlex

    bikerlex Активный пользователь

    С нами с:
    2 дек 2014
    Сообщения:
    344
    Симпатии:
    40
    @Ganzal это я понимаю. Тут психологический момент и привычка.