За последние 24 часа нас посетили 64066 программистов и 1741 робот. Сейчас ищет 821 программист ...

Передача переменной

Тема в разделе "PHP для новичков", создана пользователем Yankovitz, 16 май 2017.

  1. Yankovitz

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

    С нами с:
    21 ноя 2014
    Сообщения:
    194
    Симпатии:
    6
    Добрый день. Есть код:
    PHP:
    1. function orders_count() {
    2.     global $count_ter;
    3.     $in_process_orders = get_posts('post_type=order&status=in_process&numberposts=-1');   // Выводит число 1, именно столько записей со статусом in_process
    4.     $count_ter = count($in_process_orders);
    5.     echo $count_ter;
    6. }
    7. add_action('admin_footer_text', 'orders_count');
    8.  
    9. orders_count();
    10. global $count_ter;
    11. echo $count_ter;   // Почему выводит число 7 - общее количество записей типа order?
    Вопрос в комментарии к коду. Прошу помочь знатоков.
     
    #1 Yankovitz, 16 май 2017
    Последнее редактирование модератором: 16 май 2017
  2. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ПЛОХО

    ОТВРАТИТЕЛЬНО

    ХЕРНЯ

    дебагать надо
    var_dump() в помощь
     
  3. Yankovitz

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

    С нами с:
    21 ноя 2014
    Сообщения:
    194
    Симпатии:
    6
    Да, я уже осознал, что global это плохо.
    var_dump() показывет: int(7)
    Но для меня это ничего не значит :(
    Помогите разобраться.

    Я правильно понял, что
    Код (Text):
    1. echo $count_ter;
    плохо в связке с
    Код (Text):
    1. global $count_ter;
    Объясните пожалуйста.
     
  4. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    global не хорош сам по себе. А тут ты не учитываешь особенность php.
    1. global вне функции не имеет никакого смысла, странно, что интерпретатор не матерится
    2. Переменная в php создаётся в момент присвоения ей значения
    3. То, что ты объявил в функции переменную как глобальную, говорит php искать её в глобальном контенте. Если бы ты попробовал её использовать, php послал бы тебя подальше. Но то, что ты присваиваешь ей значение, как раз её создаёт в глобальном контексте
    4. Когда ты её потом пишешь global вне функции, ты её не создаёшь, как видимо думаешь, а ещё раз просишь искать её в глобальном контенте. И, видимо, php думает: "Хм, она у меня и так вроде глобальная, ну хрен с тобой". Т.е. строчка просто ничего не делает.
    5. Ну и переменная уже существует, у неё есть значение, см. 3.
    Работа с переменными в PHP отличается от работы с переменными в других языках, где все переменные отдельно объявляются, отдельно используются
     
  5. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    каунт фалс за единичку считает, так что надо иначе написать

    PHP:
    1. function orders_count() {
    2.     $in_process_orders = get_posts('post_type=order&status=in_process&numberposts=-1');
    3.     if (empty($in_process_orders)){
    4.         return 0;
    5.         }
    6.     $count_ter = count($in_process_orders);
    7.     return $count_ter;
    8. }
    9.  
    10.  
    11. echo orders_count();
     
  6. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.818
    Симпатии:
    1.333
    Адрес:
    Лень
    но не считает NULL
    Модиф... :
    PHP:
    1. function orders_count()
    2. {
    3.     return count ( get_posts( 'post_type=order&status=in_process&numberposts=-1' ) ?: NULL );
    4. }
     
  7. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ты ж не знаешь, что он возвращает. Твой код может работать неверно. А мой код работает в любом случае.
     
  8. Yankovitz

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

    С нами с:
    21 ноя 2014
    Сообщения:
    194
    Симпатии:
    6
    Спасибо,но все равно echo orders_count(); выводит общее количество записей, а не со статусом in_process
     
  9. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    а я и не пытался сделать именно это
    я просто причесал твой ужас и теперь им можно пользоваться
    теперь можно копать глубже и узнать, что же вообще, когда, как и зачем возвращает get_posts() и почему она принимает такой причудливый аргумент.

    Лезь в неё и покажи её код.
     
    Yankovitz нравится это.
  10. Yankovitz

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

    С нами с:
    21 ноя 2014
    Сообщения:
    194
    Симпатии:
    6
    Есть ли еще вариант как решить проблему?
    Вот есть код:
    PHP:
    1. function orders_count() {
    2.     $in_process_orders = get_posts('post_type=order&status=in_process&numberposts=-1');
    3.     if (empty($in_process_orders)){
    4.         return 0;
    5.         }
    6.     $count_ter = count($in_process_orders);
    7.     return $count_ter;
    8. }
    9.  
    10. echo orders_count();
    Почему то переменная в функции подсчет производит верно, проверено через echo
    Однако вне функции, эта же переменная считается по общему количеству записей.
    Мне просто нужно создать условие:
    if ($count_ter == 0){
    // некий код
    }
    else {
    // некий код
    }
    А вот не могу, так как значение переменной меняется :(
     
  11. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.818
    Симпатии:
    1.333
    Адрес:
    Лень
    Почему ?
    развернуто:
    Код (Text):
    1. if ( !empty ( $a = get_posts( ... ) ) )
    2. {
    3. return count ( $a );
    4. }
    5.  
    6. return count ( NULL );
     
  12. Yankovitz

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

    С нами с:
    21 ноя 2014
    Сообщения:
    194
    Симпатии:
    6
    Вообще, это из wordpress. Есть стандартный способ подсчитать:
    Код (Text):
    1. $published_posts = wp_count_posts('new_post_type')->publish;
    Однако у меня, нестандартные статусы записей
    Как ни пробовал не работает.
     
  13. Yankovitz

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

    С нами с:
    21 ноя 2014
    Сообщения:
    194
    Симпатии:
    6
    Идея собственно взята вот отсюда.
    Ерунда какая-то
     
  14. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.818
    Симпатии:
    1.333
    Адрес:
    Лень
    переменную из функции выводить дальше в коде, тебе не кажется это странным ?o_O
     
  15. Yankovitz

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

    С нами с:
    21 ноя 2014
    Сообщения:
    194
    Симпатии:
    6
    Кажется. Однако, если я условие пропишу в функции, то у меня получится функция в функции.
     
  16. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.818
    Симпатии:
    1.333
    Адрес:
    Лень
    пробуй..
    PHP:
    1. $r = orders_count();
    2. if ( $r ){
    3. echo "{$r} - гуд";
    4. }
    5. else
    6. {
    7. echo "{$r} - не гуд";
    8. }
    и почитай инфу как работают функции в пхп
     
  17. Yankovitz

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

    С нами с:
    21 ноя 2014
    Сообщения:
    194
    Симпатии:
    6
    Выводит 7 - гуд
     
  18. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.818
    Симпатии:
    1.333
    Адрес:
    Лень
    и ?
    --- Добавлено ---
    а что хотел ?
     
  19. Yankovitz

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

    С нами с:
    21 ноя 2014
    Сообщения:
    194
    Симпатии:
    6
    Переменная в функции подсчет и вывод производит верно, проверено через echo. Выводит 1.
    Однако вне функции, эта же переменная считается по общему количеству записей. Выводит 7
     
  20. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    нет
    и
    это разные два кода. они не однозначны и ведут себя по-разному в разных ситуация. Более того, твой вариант не даёт предсказуемого однозначного поведения, если не держать в голове при рефакторинге get_posts() особенностей приведения типов в условиях, которых находят вне этой функции. Это сложно. Это ненужная сложность.
    --- Добавлено ---
    этого не может быть =)
    показывай свой код вместе с дебагом и его результатами на этих шагах.
     
  21. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.818
    Симпатии:
    1.333
    Адрес:
    Лень
    Так у тебя же проверка выходных данных проходит через empty , не определяя ее тип, дальше в случае фалсе ( тоесть там что то есть ) идет на счет count, так ? так! Я же предоставил код в виде "нейтрона"
    ?: == ( 1 ? 1 : 0 )
    0 == count ( NULL )

    И в итоге до сих пор я не могу понять почему "печаль беда", почему твой код правильнее ?:)
     
    #21 MouseZver, 18 май 2017
    Последнее редактирование: 18 май 2017
  22. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Вам нужно не помочь, вам нужно книжку по программированию какую нибудь взять да почитать.
    Я просто в изумлении, такое ощущение что пошла деградация мозгов у людей. Я уже не в первый раз, за последние время, вижу подобные темы, где люди спрашивают вопросы по программированию, не понимая что такое программирование вообще. Полный аутизм садится писать код программы не понимая что такое переменные.
     
  23. Fell-x27

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

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Имеет имеет. В семерке не тестил, но в пятерке была такая фича, что если переменная какая-то объявлена в подключаемом файле, то подключающий не увидит ее, если через global не объявит. Ну или мне так казалось...
     
  24. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    @MouseZver
    да, точно, у тебя правильный код, прости, там же обычное сравнение, а меня что-то сглючило.
     
  25. Алекс8

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

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    привет всем)) я тут новый человек)) просто сразу увидел этот пост) захотелось написать
    немного оффтопа)) есть такой движок simplemachines - там все построено на передаче данных из функции в функцию с помощью global переменных.. движок сам по себе неплохой) мне нравится) так что и такое решение имеет право на жизнь ИМХО))
    хотя да - мне больше нравится когда в функцию что то передается и она что то возвращает)