За последние 24 часа нас посетили 17858 программистов и 1700 роботов. Сейчас ищут 1535 программистов ...

PHP функция

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

  1. dalet

    dalet Новичок

    С нами с:
    5 дек 2017
    Сообщения:
    16
    Симпатии:
    1
    Не могу понять, почему не срабатывает функция при вызове по имени.

    PHP:
    1. function decode(){
    2.    $text = quoted_printable_decode($text);
    3. }
    4.  
    5. $text = "=D0=9F=D1=80=D0=B8=D0=B2=D0=B5=D1=82=0D=0A";
    6. decode();
    7. echo $text;
     
  2. Fell-x27

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

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    Функция-то срабатывает, но в нее надо бы передать переменную.
     
  3. dalet

    dalet Новичок

    С нами с:
    5 дек 2017
    Сообщения:
    16
    Симпатии:
    1
    Вы сюда заходите, чтобы поумничать и поунижать новичков? Похвально!

     
  4. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Гениально.
    --- Добавлено ---
    А доку почитать как функции работать должны. Да вообще книжку открыть полистать хотя бы.
    --- Добавлено ---
    PHP:
    1. function decode($text){
    2.    $text = quoted_printable_decode($text);
    3.    return $text;
    4. }
    5. $text = "=D0=9F=D1=80=D0=B8=D0=B2=D0=B5=D1=82=0D=0A";
    6. $text = decode($text);
    7. echo $text;
    @dalet А вот теперь найди 4 отличия. От своей функции
     
  5. vaajnur

    vaajnur Новичок

    С нами с:
    15 май 2017
    Сообщения:
    40
    Симпатии:
    3
    или объявить ее глобальной внутри функции
     
  6. dalet

    dalet Новичок

    С нами с:
    5 дек 2017
    Сообщения:
    16
    Симпатии:
    1
    не понятно
    decode($text) - не варик
     
  7. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    и да ты что, а чем это поможет в данном случае? Ну ка так посотреть чтобы, а то я даже додуматься не могу как это, смастери мне код на глобальной переменной внутри функции;
     
  8. dalet

    dalet Новичок

    С нами с:
    5 дек 2017
    Сообщения:
    16
    Симпатии:
    1
    Спасибо. Я думал, что указывать имя переменной в названии функции до создания переменной не имеет смысла.

     
  9. vaajnur

    vaajnur Новичок

    С нами с:
    15 май 2017
    Сообщения:
    40
    Симпатии:
    3
    вот тебе код, но так писать не стоит
    Код (Text):
    1.  
    2. function decode(){
    3.    global $text;
    4.    $text = quoted_printable_decode($text);
    5. }
    6.  
    7. $text = "=D0=9F=D1=80=D0=B8=D0=B2=D0=B5=D1=82=0D=0A";
    8. decode();
    9. echo $text;
     
  10. dalet

    dalet Новичок

    С нами с:
    5 дек 2017
    Сообщения:
    16
    Симпатии:
    1
    Вот я по такому же примеру и делал:

    PHP:
    1. function change(){
    2.     global $text;
    3.     $text='Ваш текст поменялся';
    4. }
    5. $text='Очень хороший сайт';
    6. change();
    7. echo $text;

     
  11. Хыиуду

    Хыиуду Активный пользователь

    С нами с:
    3 июн 2014
    Сообщения:
    618
    Симпатии:
    5
    Так не сработает. Объявлять глобальную переменную глобальной в глобальной области - можно, а смысл? В функции-то ее все равно видно не будет.
    А вот так должно. Хотя все-таки global - не лучший выход.
    PHP:
    1. function decode(){
    2.   global $text;
    3.    $text = quoted_printable_decode($text);
    4. }
    5. $text = "=D0=9F=D1=80=D0=B8=D0=B2=D0=B5=D1=82=0D=0A";
    6. decode();
    7. echo $text;
     
  12. vaajnur

    vaajnur Новичок

    С нами с:
    15 май 2017
    Сообщения:
    40
    Симпатии:
    3
    смысло нет, зато наглядно можно показать область видимости переменной
     
  13. dalet

    dalet Новичок

    С нами с:
    5 дек 2017
    Сообщения:
    16
    Симпатии:
    1
    А обязательно return $text; добавлять в код функции? Без него то же работает


    PHP:
    1. function decode($text){
    2.    $text = quoted_printable_decode($text);
    3.    //return $text;
    4. }
    5. $text = "=D0=9F=D1=80=D0=B8=D0=B2=D0=B5=D1=82=0D=0A";
    6. $text = decode($text);
    7. echo $text;
     
  14. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    @Хыиуду ide любая сама пишет. а это хлам.
    --- Добавлено ---
    да обязательно иначе это тогда не функция а процедура и тогда код тебе нужен следующий:
    PHP:
    1. function decode($text){
    2.         echo quoted_printable_decode($text);
    3. }
    4. $text = "=D0=9F=D1=80=D0=B8=D0=B2=D0=B5=D1=82=0D=0A";
    5. decode($text);
     
  15. dalet

    dalet Новичок

    С нами с:
    5 дек 2017
    Сообщения:
    16
    Симпатии:
    1
    Именно. Это для imap код, там 6-7 разных условий, и в каждый нужно вписать фукнкцию декодирования, что вызовом функции по имени - удобней, чем полный код 7 раз копипастить. Я сторонник "чистого кода".
     
  16. voral

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

    С нами с:
    30 ноя 2017
    Сообщения:
    646
    Симпатии:
    104
    вариант "автор топика показал только минимально-необходимый для пояснения код" не прокатывает?
     
  17. Fell-x27

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

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    Итак, тема немного схуднула, весь срач ушел сюда.
    --- Добавлено ---
    Далее, автор, выбирай:

    1) Вариант без return, передача параметра по ссылке.
    PHP:
    1. function decode(&$encoded_text){
    2.    $encoded_text = quoted_printable_decode($encoded_text);
    3. }
    4.  
    5. $text = "=D0=9F=D1=80=D0=B8=D0=B2=D0=B5=D1=82=0D=0A";
    6. decode($text);
    7. echo $text;
    Злоупотреблять такими вещами не стоит, так как по-хорошему, лучше, чтобы функция явно что-то возвращала. Удобнее сопровождать такой код. А просто вызов с параметром - не очевидно, что оно делает, приходится лезть внутрь, смотреть. Оно ж может вообще на базе этой переменной, хз, нейросеть строить.

    2) Православный вариант
    PHP:
    1. function decode($encoded_text){
    2.   return quoted_printable_decode($encoded_text);
    3. }
    4.  
    5. $text = "=D0=9F=D1=80=D0=B8=D0=B2=D0=B5=D1=82=0D=0A";
    6. $text = decode($text);
    7. echo $text;
    Взяли переменную, отдали в функцию, присвоили результат работы обратно. Наглядно, просто, интуитивно.

    Варианты с global я бы не стал рассматривать. Этот не совсем тот случай, когда они нужны. Это вносит хаос в код очень часто. Код, над которым нет контроля - мусор. Пока у тебя скрипты мелкие, оно не ощущается. Но потом будет больно.

    Далее.

    Если ты внутри функции объявил переменную с тем же именем, что и вне функции, это все равно две разные переменные. Внутри функции своя область видимости, закрытая от внешнего мира. Программа в программе. Если надо кровь из носу как передать внутрь функции переменную, объявленную извне, но не явно, то да, юзаем global. Мы как бы говорим функции, что переменную с таким вот именем надо искать не внутри своей области видимости, а снаружи.

    Далее.

    Тут был озвучен тезис "если для новичка - то пофиг как, лишь бы работало". Это плохо. Для новичка, который не умеет еще отличать добро ото зла, это буквально приговор.
     
    Walk и askanim нравится это.
  18. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    так же есть, ещё замыкание. use там все дела
    --- Добавлено ---
    PHP:
    1. $str = 'Кушак из серебра';
    2. function anon ($string) use ($str) {
    3.     return $str . $string;
    4. }
    5. echo anon(', где же он?');
    --- Добавлено ---
    Использование глобальных переменных может привести к следующему результату:
    PHP:
    1. <?php global $var;
    2. $var = false;
    3. // Допустим пусть тут в вар попадают переменные с гета
    4. if (!empty($_GET['id'])) $var = $_GET['id'];
    5. ....
    6.  
    7. /* Какой - то кусок кода*/
    8. ...
    9.  
    10. потом ты делаешь где нибудь вот так
    11. $res = $db->fetch(); // допустим получили строку
    12. $var = functionAnonimus($res['id']);
    13.  
    14. ...
    15.  
    16. /*ниже ещё кусок огромный кода*/
    17. /*где на основе первой глобальной выполняются действия например:*/
    18. ...
    19.  
    20. if($var === false) {
    21.       // Исполнение некоего алгоритма
    22. }
    23. else {
    24.       // И тут что-то другое
    25.      //и тут например другое обработка нашей $var напрмиер запрос к бд по id
    26.      $res = $dv->query('select')->where('id', '=', $var)->get(); // Тут уже случится фатальная ошибка. И код дальше не пойдёт
    27.       print_r($res);
    28. }
    --- Добавлено ---
    Когда в коде уже переваливает за 10 тки тыщ строк ориентироваться по нему оч тяжело.
    --- Добавлено ---
    Иде конечно спасает во многом если пишем по всем правильным стандартам. Но если ещё выкидывать такие плюхи, то это будет просто не реально поддерживать.
     
  19. keren

    keren Новичок

    С нами с:
    15 ноя 2017
    Сообщения:
    513
    Симпатии:
    42
    Я кстати не знал что переменные в параметре функции и в вызове могут быть разными.
     
  20. Fell-x27

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

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    Ключевой момент в том, что ты ведь не пишешь функцию под одну конкретную переменную? В таком случае и смысла особого в ней нет скорее всего.

    У функции есть понятие "параметр". Когда ты передаешь в нее переменную, то ее значение копируется в параметр. И функция работает с ним, не влияя на переданную переменную. Это если просто передать. А если как в моем первом примере - влияет, тогда ты в параметр передаешь не просто значение, а ссылку на саму переменную. И оперируешь как бы непосредственно с ней уже.

    Более того, в функцию можно передавать не переменную, а просто константное значение неименованное.

    PHP:
    1. function foo($bar){
    2.     echo $bar;
    3. }
    4.  
    5. foo('123');
     
  21. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Это только анонимные функции
     
  22. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Т.е. так:
    PHP:
    1. <?php
    2. $str = 'Кушак из серебра';
    3. $anon = function ($string) use ($str) {
    4.     return $str . $string;
    5. };
    6. echo $anon(', где же он?');
     
  23. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Иде конечно спасает во многом если пишем по всем правильным стандартам. Но если ещё в
    ? я в любом методе их юзаю. И там определённо не анонимные они.
    --- Добавлено ---
    В чём прикол почему так?
    --- Добавлено ---
    я просто уже давно функции не юзаю я в основном хреначу на методах всё... Да и use на функцию в жизни не юзал, но думал так же как на метод применяется :D
     
  24. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Use можно использовать только с анонимными, иначе Parse Error: https://ideone.com/SX3hSy
     
  25. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    @mkramer а почему именно так?
    --- Добавлено ---
    @mkramer @Deonis жиесть а я даже не знал...