Почему функции, указанные в качестве значений, вызываются сами по себе?

Тема в разделе "PHP", создана пользователем bugargen, 14 сен 2009.

Статус темы:
Закрыта.
Модераторы: latteo
  1. bugargen

    bugargen

    Регистр.:
    24 апр 2008
    Сообщения:
    232
    Симпатии:
    19
    Например, мне нужно загнать в два массива значения, которые в последствии будут использоваться в preg_replace.

    PHP:
    $m1 = array ( '/One/''/Two/''/Three/' );

    $m2 = array ( func('Один'), func('Два'), func('Три') );

    . . . . .

    $str preg_replace $m1$m2$str );
    В итоге, функция func() будет вызваться сама-собой, даже если никаких совпадений в preg_replace не обнаружено.

    Почему?
     
  2. antn

    antn Постоялец

    Регистр.:
    11 июл 2009
    Сообщения:
    104
    Симпатии:
    30
    PHP:
    $m2 = array ( func('Один'), func('Два'), func('Три') );
    В этой строке стоят 3 вызова этой функции, почему же сама собой, если ты её намеренно вызываешь?)
     
  3. bugargen

    bugargen

    Регистр.:
    24 апр 2008
    Сообщения:
    232
    Симпатии:
    19
    А как же тогда поступить для достижения вышеуказанной цели?

    Кстати, код вида:
    PHP:
    $str preg_replace '/One/'func('Один'), $str );
    тоже вызовет функцию, вне зависимости от выполнения условия..
     
  4. painsource

    painsource Постоялец

    Регистр.:
    13 июл 2009
    Сообщения:
    64
    Симпатии:
    8
  5. Kloster

    Kloster

    Регистр.:
    22 июн 2009
    Сообщения:
    216
    Симпатии:
    12
    Что-то я не пойму, чего ты хочешь?
    Вызывая
    PHP:
    $str preg_replace '/One/'func('Один'), $str );
    ты передаешь в параметр не функцию, а значение, которое она возвращает, чтобы значение получить и передать, необходимо ф-ю вызвать, вот она и вызывается, а потом только проверяется preg_replace. Так и в первом примере она 3 раза вызывается.
    Поясни точнее. чего хочешь добиться, может есть нормальные способы.
     
  6. polyetilen

    polyetilen Заблокирован

    Регистр.:
    10 авг 2006
    Сообщения:
    814
    Симпатии:
    474
    PHP:
    $m1 = array ( '/One/''/Two/''/Three/' );
    $m2 = array ( '/Один/''/Два/''/Три/' );
    $str "One Three Two Two";

    $str2 preg_replace $m1$m2$str ); 
    preg_replace_callback$m2"func"$str2);

    function 
    func($t){
        echo 
    $t[0];
    }
     
  7. bugargen

    bugargen

    Регистр.:
    24 апр 2008
    Сообщения:
    232
    Симпатии:
    19
    Млин, всё гениальное - оказалось простым :ay:
    Есть такой волшебный модификатор e! Я знал про это, но смысла, заложенного в него, не догонял.. Теперь разобрался и на седьмом небе от счастья :D

    Вот полностью правильный и рабочий код, без всяких preg_replace_callback:
    PHP:
    $m1 = array ( '/One/e''/Two/e' );

    $m2 = array ( "func('Один')""func('Два')" );

    function 
    func $q ) {

        if ( 
    $q == 'Один' ) return '1';
        if ( 
    $q == 'Два'  ) return '2';

    }

    $str 'Тут идёт цифра One, а тут Two. Пожалуй, добавим ещё одну Two и одну One! Конец примера...';

    $str preg_replace $m1$m2$str );
    Я в чём-то не прав?
     
Статус темы:
Закрыта.