2012-03-06 2 views
0

매개 변수를 취하는 두 가지 기능이 있습니다.호출 할 때만 읽기 기능 - PHP

내 스크립트의 작동 방식은 일부 데이터를 문자열로 검색한다는 것입니다. 이 문자열은 두 가지 형식 일 수 있습니다.이 형식은 나에게 알려지지 않았으므로 미리 얻을 수 없습니다.

그래서 각 형식 유형에 대해 하나씩 두 가지 기능이 있습니다.

함수 1이 먼저 호출되며 문자열이 매개 변수로 전달됩니다. 그런 다음이 함수 내의 변수가 할당되었는지 확인합니다. 변수가 지정되면 문자열 형식이 인식되었음을 의미합니다. 변수가 할당되지 않은 경우 동일한 매개 변수로 함수 2가 호출됩니다. 이것은 효과가있다.

문제점은 function1이 작동하는 경우 스크립트를 실행할 때 함수 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); 
} 
+0

정확한 오류를 붙여주십시오. 어떤 것을 기반으로 여기에 정의되지 않은 인덱스가 함수 2 안에 있지 않은 if (! $ eventstart) {'에서 발생한다고 생각할 것입니다. – Julien

+1

또한 'preg_match'는 값을 반환합니다. 그것이 성공했다고 가정하기 전에 그것을 확인하십시오. – hakre

+0

'$ eventtype'에 대한 예제 문자열을 제공하십시오. 적어도 두 개는 첫 번째 (하루)에 한 개, 두 번째 유형 (한주에 한 개)에 하나씩 일치합니다. – hakre

답변

0

가장 빠른 해결책은 함수 외부에서 필요한 변수를 전역 변수로 만드는 것입니다. 함수의 시작 부분에

global $eventstart, $eventend... 

를 넣습니다.

하지만 실제로 디자인은 끔찍합니다. 함수가 대신 해시 또는 null을 반환하도록합니다.

0

조건을 더 신중하게 정의 해보십시오. 두 이벤트가 실행되는 유일한 방법은 $ eventstart가 설정된 경우입니다. 아마도 :

if ($eventstart == ""){} 

이렇게하면 조건이 실행되지 않아야합니다. 또 다른 옵션은 첫 번째 함수의 끝에서 특정 조건에 $ eventstart를 설정 한 다음 두 번째 실행 해당 조건을 찾아 것입니다 : 당신은 당신의 기능을해야,

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

Bests을

1

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" 
} 

.

관련 문제