Только чтение функций при вызове - PHP - PullRequest
0 голосов
/ 06 марта 2012

У меня есть две функции, которые принимают параметр.

Мой скрипт работает так, что он получает некоторые данные в виде строки.Эта строка может быть в двух форматах, что мне неизвестно и не может быть получено заранее.

Итак, у меня есть 2 функции, по одной для каждого типа формата.

Сначала вызывается функция 1 со строкой, передаваемой в качестве параметра.Затем я проверяю, была ли назначена переменная в этой функции.Если переменная была назначена, это означает, что формат строки был распознан.Если переменная не была назначена, функция 2 вызывается с тем же параметром.Это должно работать.

Проблема в том, что когда я запускаю скрипт, скажем, если функция 1 работает, то я получаю неопределенные переменные ошибки для функции 2. Я не понимаю, почему это так, поскольку это не такбыл вызван еще и поэтому не должен был обрабатываться / смотреть.

Можно ли сделать функцию доступной только при ее вызове?

recurrence_info_day($eventtype);
$recurrence_type = "daily";
if (!$eventstart){
   recurrence_info_weekly($eventtype);
   $recurrence_type = "weekly";
}

function recurrence_info_day($eventtype){
    $s = $eventtype;    
    preg_match('/^DTSTART;VALUE=DATE:(\d+)\s+DTEND;VALUE=DATE:(\d+)\s+RRULE:FREQ=(\w+);INTERVAL=(\d+);UNTIL=(\d+)/', $s, $recinfod);
    $eventstart = $recinfod[1];
    $eventend = $recinfod[2];
    $eventfrequency = $recinfod[3];
    $eventinterval = $recinfod[4];
    $eventuntil = $recinfod[5];

    $formstartdate = substr($eventstart,4,2)."/".substr($eventstart, 6)."/".substr($eventstart,0,4);
    $formenddate = substr($eventuntil,4,2)."/".substr($eventuntil, 6)."/".substr($eventuntil,0,4);
}

function recurrence_info_weekly($eventtype){
    $s = $eventtype;
    preg_match('/^DTSTART;VALUE=DATE:(\d+)\s+DTEND;VALUE=DATE:(\d+)\sRRULE:FREQ=(\w+);BYDAY=(\d+);UNTIL=(\d+)/', $s, $recinfow);
    $eventstart = $recinfow[1];
    $eventend = $recinfow[2];
    $eventfrequency = $recinfow[3];
    $eventdays = $recinfow[4];
    $eventuntil = $recinfow[5];

    $formstartdate = substr($eventstart,4,2)."/".substr($eventstart, 6)."/".substr($eventstart,0,4);
    $formenddate = substr($eventuntil,4,2)."/".substr($eventuntil, 6)."/".substr($eventuntil,0,4);
}

Ответы [ 3 ]

1 голос
/ 06 марта 2012

Вам нужно, чтобы ваши функции возвращали что-то , чтобы вы знали, соответствуют ли они чему-либо:

function myFunction() {
    return 'A';
}

$a = myFunction();
echo $a; # value;

Ваша функция возвращает более одного значения.Таким образом, вы можете заставить его возвращать несколько значений, что можно сделать с помощью массива:

function myFunction2() {
    return array('A', 'B');
}

list($a, $b) = myFunction2();
echo $a, ' ', $b; # A B;

Помимо этих основ, у вас есть много дублирования кода в этих двух функциях.Они в основном отличаются по шаблону, с которым вы работаете preg_match.Таким образом, вы можете извлечь эту часть как собственный метод (Refactoring -> Extract Method).

Выполнение этого и фактическая проверка возвращаемых значений из ваших собственных функций и функций PHP могут привести к этому.Что не идеально, но показывает некоторое улучшение по сравнению с исходным кодом и позволяет вам фактически проверить, был ли запущен какой-либо тип события.Пример:

$eventtype = 'DTSTART;VALUE=DATE:123456789 DTEND;VALUE=DATE:123456789 RRULE:FREQ=2;INTERVAL=2222;UNTIL=123456789';

$result = recurrence_info_day($eventtype);
if ($result) {
    $recurrence_type = "daily";
    list($event, $form) = $result;
} else {
    $result = recurrence_info_weekly($eventtype);
    if ($result) {
        $recurrence_type = "weekly";
        list($event, $form) = $result;
    }
}

var_dump($eventtype, $recurrence_type, $event, $form);


function recurrence_info_day($eventtype){
    $pattern = '/^DTSTART;VALUE=DATE:(\d+)\s+DTEND;VALUE=DATE:(\d+)\s+RRULE:FREQ=(\w+);INTERVAL=(\d+);UNTIL=(\d+)/';
    return reccurence_info_pattern($eventtype, $pattern);
}

function recurrence_info_weekly($eventtype){
    $pattern = '/^DTSTART;VALUE=DATE:(\d+)\s+DTEND;VALUE=DATE:(\d+)\sRRULE:FREQ=(\w+);BYDAY=(\d+);UNTIL=(\d+)/';
    return reccurence_info_pattern($eventtype, $pattern);
}

function reccurence_info_pattern($eventtype, $pattern)
{
    $r = preg_match(
        $pattern,
        $eventtype,
        $recinfow
    );

    if (!$r) {
        return NULL;
    }

    $event = new stdClass();
    $event->start = $recinfow[1];
    $event->end = $recinfow[2];
    $event->frequency = $recinfow[3];
    $event->days = $recinfow[4];
    $event->until = $recinfow[5];

    $form = new stdClass();
    $form->startdate = substr($event->start, 4, 2) . "/" . substr($event->start, 6) . "/" . substr($event->start, 0, 4);
    $form->enddate = substr($event->until, 4, 2) . "/" . substr($event->until, 6) . "/" . substr($event->until, 0, 4);
    return array($event, $form);
}

Вывод:

string(98) "DTSTART;VALUE=DATE:123456789 DTEND;VALUE=DATE:123456789 RRULE:FREQ=2;INTERVAL=2222;UNTIL=123456789"
string(5) "daily"
object(stdClass)#1 (5) {
  ["start"]=>
  string(9) "123456789"
  ["end"]=>
  string(9) "123456789"
  ["frequency"]=>
  string(1) "2"
  ["days"]=>
  string(4) "2222"
  ["until"]=>
  string(9) "123456789"
}
object(stdClass)#2 (2) {
  ["startdate"]=>
  string(11) "56/789/1234"
  ["enddate"]=>
  string(11) "56/789/1234"
}

Надеюсь, это полезно.

0 голосов
/ 06 марта 2012

Попытайтесь определить ваше условие более тщательно - единственный способ запустить функцию два - это установить $ eventstart.Возможно:

if ($eventstart == ""){}

Это должно помешать условному запуску.Другой вариант - установить $ eventstart в определенное условие в конце первой функции, а затем искать это условие для запуска второй:

(within first function) if ($recinfod[1] ==""){$eventstart = FALSE};

Bests,

0 голосов
/ 06 марта 2012

Самое быстрое решение - сделать переменные, которые вам нужны, вне функции глобальными. Помещенный

global $eventstart, $eventend...

в начале функции.

Но на самом деле дизайн ужасен. сделать так, чтобы функции возвращали хеш или ноль.

...