只在调用时读取函数 - PHP

时间:2012-03-06 15:29:51

标签: php function

我有两个函数,它们带一个参数。

我的脚本的工作方式是它以字符串形式检索一些数据。这个字符串可以是两种格式,这对我来说是未知的,不能事先获得。

所以我有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 个答案:

答案 0 :(得分: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运行的模式基本不同。因此,您可以将该部分提取为自己的方法(重构 - >提取方法)。

这样做并实际检查来自您自己和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"
}

我希望这有用。

答案 1 :(得分:0)

最快的解决方案是在函数全局之外创建所需的变量。 放

global $eventstart, $eventend...

在函数的开头。

但实际上,设计很糟糕。使函数返回一个hash或null。

答案 2 :(得分:0)

尝试更仔细地定义条件 - 函数2运行的唯一方法是设置$ eventstart。也许:

if ($eventstart == ""){}

这应该可以阻止条件被触发。 另一个选项是将$ eventstart设置为第一个函数末尾的特定条件,然后查找该条件以运行第二个函数:

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

贝斯茨,