За последние 24 часа нас посетили 26753 программиста и 1482 робота. Сейчас ищут 928 программистов ...

Переменная строке.

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

  1. oleg_

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

    С нами с:
    28 ноя 2012
    Сообщения:
    108
    Симпатии:
    2
    Всем привет
    Подскажите, никак не пойму:
    получаю строку в которой переменная $rr
    Код (Text):
    1. $tt=$sc->get('body')->value;
    2. $rr=7777;
    3. var_dump($tt);
    результат
    string(44) "
    {$rr}
    $rr
    ${rr}"
    переменная не подменяется, почему?
     
  2. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.814
    Симпатии:
    1.332
    Адрес:
    Лень
    oleg_ и denis01 нравится это.
  3. oleg_

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

    С нами с:
    28 ноя 2012
    Сообщения:
    108
    Симпатии:
    2
    это друпал, достаю из ноды содержимое
    Код (Text):
    1. $sc=\Drupal::entityTypeManager()->getStorage('node')->load(16479);
    2. $tt=$sc->get('body')->value;
     
  4. oleg_

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

    С нами с:
    28 ноя 2012
    Сообщения:
    108
    Симпатии:
    2
    да, eval работает, спасибо
     
  5. oleg_

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

    С нами с:
    28 ноя 2012
    Сообщения:
    108
    Симпатии:
    2
    но все таки не пойму, чем эта строка так экранируется.
    вот например строка
    Код (Text):
    1. 'аарпапап <a href="/">'.$rr.'</a>счмс'.$rr.'чмчсмчс';
    все работает и без eval
    а тут фиг
    string(29) "
    '.$rr.'".$rr.".${rr}
    "
     
  6. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.814
    Симпатии:
    1.332
    Адрес:
    Лень
    а нафига ты парсишь пхп исходный код?
     
  7. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    Потому что переменные подставляются только в строковые константы. То, что уже сидит в переменной, оно там и будет сидеть
     
  8. oleg_

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

    С нами с:
    28 ноя 2012
    Сообщения:
    108
    Симпатии:
    2
    суть вот в чем: нужно сделать печать документов(счет, сч.ф, нак). Формы документов периодически меняются.
    Я делаю стандартный документ шаблоном. Соответственно его всегда можно изменить из админки.
    А что бы подставить в этот шаблон требуемые данные я в него ставлю переменные, например:
    ИНН/КПП продавца: $inn
    Когда происходит печать, дергается текущий документ и шаблон, и из текущего документа в шаблон подставляются значения.
    И результат печатается
    --- Добавлено ---
    Код (Text):
    1. $rr=7777;
    2. $tes='аарпапап <a href="/">'.$rr.'</a>счмс'.$rr.'чмчсмчс';
    3. $tt=$sc->get('body')->value;
    4. $tt.=$tes;
    5. var_dump($tt);
    string(75) "
    $rr
    аарпапап 7777счмс7777чмчсмчс"
    в чем разница между $tes и $tt ? В $tes аналогичная строка что и в $tt
     
  9. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    в пхп есть $$var ;)
     
    denis01 нравится это.
  10. oleg_

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

    С нами с:
    28 ноя 2012
    Сообщения:
    108
    Симпатии:
    2
    Суперстар, намек не понял. Как тут может помочь динамическая переменная?
    Мне нужно определенным в документе (в $rr строке $ee) переменным присвоить значение. Даже не догадываюсь как приладить сюда $$rr, намекните еще чуть чуть.
     
  11. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    В том, что php - интерпретатор. В процессе обработки строки кода под цифрой 2 подставляется значение переменной, а в процессе обработки строки кода 3 - берётся просто готовая строка.
    Подумайте об использовании простейшей sprintf()...
     
  12. oleg_

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

    С нами с:
    28 ноя 2012
    Сообщения:
    108
    Симпатии:
    2
    Sail, понятно что дополнительными функциями этот вопрос решить можно. Мне просто принцип не понятен, почему одна строка обрабатывается php а другая нет....
     
  13. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Из-за двойных кавычек. Но это только при исполнении скрипта. Eval() может помочь. А $$ может и ни к чему, может меня сглючило.
     
  14. oleg_

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

    С нами с:
    28 ноя 2012
    Сообщения:
    108
    Симпатии:
    2
    Eval рабтает, но я все таки хочу уяснить, почему просто так не срабатывает. Пробовал разные вариации с кавычками, ничего не срабатывает
    Код (Text):
    1. $tes="аарпапап <a href=/>".$rr."</a>счмс".$rr."чмчсмчс";
    2. $tt=$sc->get('body')->value;
    3. $tt.=$tes;
    4. $rr=8888;
    5. var_dump($tt);
    string(77) "

    ".$rr."

    аарпапап 8888счмс8888чмчсмчс"
     
  15. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    Ещё раз. ПОдставлять значения переменных можно только в строковые константы
    Код (Text):
    1. <?php
    2.  
    3. $a = 12;
    4. $b = "$a - это хорошо"; // Константа с подстановкой, всё сработает
    5. $c = '$a - это хорошо'; // Константа, но в одинарных кавычках. Подстановки не будет
    6. $d = $c; // Не константа. Не сработает
    7.  
    8. function f() {
    9.    global $c;
    10.    return $c;
    11. }
    12.  
    13. $e = f(); // Не константа, не сработает


    Конечно, название константа здесь не совсем корректно применять, но я не знаю, как это обозвать
     
  16. oleg_

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

    С нами с:
    28 ноя 2012
    Сообщения:
    108
    Симпатии:
    2
    Код (Text):
    1. $a = 12;
    2. $b = "$a - это хорошо"."\n"; // Константа с подстановкой, всё сработает
    3. $c = '$a - это хорошо'."\n"; // Константа, но в одинарных кавычках. Подстановки не будет
    4. $d = '$a - это'.$a.' хорошо'."\n"; // Константа, но в одинарных кавычках.  +  '.$a.'  - все работает
    5. $e=$d; // все работает
    6.  
    7. echo $b;
    8. echo $c;
    9. echo $d;
    10. echo $e;
    результат:
    12 - это хорошо
    $a - это хорошо
    $a - это12 хорошо
    $a - это12 хорошо

    в моем случае строка, и никакие манипуляции типа '.$a.' ".$a." не работают. Строка не разрывается. Это конечно не проблема, но я хочу понять, почему?
     
  17. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    строка делается на момент формирования строки. т.е. в той первой строчке уже она сляпается из тех значений переменных, что они имеют на тот момент, когда эта строка вычисляется.
    --- Добавлено ---
    а, я вспомнил безумный ход мысли с $$, но я не буду его озвучивать, т.к. он не требуется, можно обойтись ассоциативными массивами.

    короче суть в том, что ты можешь значения подменять по какому-то принципу, если не хочешь морочиться с eval(). Например подменять в строке %abc% на значение из массива по ключу abc.
     
  18. oleg_

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

    С нами с:
    28 ноя 2012
    Сообщения:
    108
    Симпатии:
    2
    вот теперь кажись понял, если строку собрать за пределами видимости функции, то без eval она уже не обработается, правильно?
     
  19. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Не. Строка собирается в момент собирания строки. И всё. :D
     
  20. oleg_

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

    С нами с:
    28 ноя 2012
    Сообщения:
    108
    Симпатии:
    2
    тогда не пойму в чем разница между:
    $a=$sc->get('body')->value;
    $b=$rr

    echo $a
    echo $b

    вывод
    $rr
    пусто
    нижняя обрабатывается а верхняя нетo_Oo_O
     
  21. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    я не понял этого кода. $a, $b и $rr в данном случае никак между собой не связаны. На основании этого кода нельзя сказать как и что должно выводиться.
     
  22. oleg_

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

    С нами с:
    28 ноя 2012
    Сообщения:
    108
    Симпатии:
    2
    $a=$sc->get('body')->value; - в $a передается строка в которой содержится $rr
    $b=$rr - тут все понятно
    то есть и в $a и в $b содержится $rr
    echo $a
    $rr - так и выводится, как будто там '$rr' но при этом если вставить туда '.$rr.' то так и выводится
    '.$rr.' вместо того что бы разбить строку и обрабатываться как переменная
    echo $b
    пусто - ну переменной ничего не присваивается поэтому и пусто
    интерпретатор каким то образом отличает для себя эти две строки
    $a=$sc->get('body')->value;
    $b=$rr
    несмотря на то, что содержимое их идентично.
     
  23. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    в это строке нет ничего про $rr, поэтому я не могу сделать такой вывод, поэтому дальнейшие рассуждения у меня не совпадают с твоими.
     
  24. oleg_

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

    С нами с:
    28 ноя 2012
    Сообщения:
    108
    Симпатии:
    2
    Ну полностью это так выглядит:
    загружается объект, из которого достается значение поля body - содержимое документа в виде строки. В содержимом в данном случае только $rr.
    Код (Text):
    1. $sc=\Drupal::entityTypeManager()->getStorage('node')->load(16479);
    2. echo $sc->get('body')->value;
    вывод echo:
    $rr
     
  25. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    Не в то значение, которое функция возвращает, а только когда строка задана в двойных кавычках прямо в тексте программы. Олег, то, что ты мой код переделал, чтоб работало, ни о чём не говорит, я тебе специально показал случаи, в которых не работает, в том числе - при возврате из функции