循环使用对象运算符

时间:2015-08-17 15:27:07

标签: php mysql loops calendar operators

我正在玩PHP Calendar(Corey Worrell)并且有关于实例循环的问题。为了初始化日历,我必须输出:

$calendar->standard('today')
        ->standard('prev-next')
        ->standard('holidays')
        ->attach($event1)
        ->attach($event2)
        ->attach($event3)
        ->attach($event4)
        ->attach($event5)
        ->attach($event6)
        ->attach($event7)
        ->attach($event8)
        ->attach($event9)
        ->attach($event10)
        ->attach($event11)
        ->attach($event12)
        ->attach($event13)
        ->attach($event14)
        ->attach($event15)
        ->attach($event16)
        ->attach($event17);

每个 - >附加($ event#)会在日历上输出一个事件。我想循环遍历这些数字递增的事件名称,但在该代码中的任何地方添加for循环会中断所有内容,从而输出此错误:

  

PHP Catchable致命错误:参数1传递给   Event_Subject :: attach()必须是Event_Observer的实例,为null   给定,在第75行的/calendar/index.php中调用并在中定义   第21行的/calendar/classes/event_subject.php

这是我尝试过的循环:

$calendar->standard('today')
        ->standard('prev-next')
        ->standard('holidays')
        for ($inc = 0; $inc <= $number_of_events; $inc++) {
            if ($inc == $number_of_events) {
                ->attach($$event_name);
            }
            else {
                ->attach($$event_name)
            }
        }

我怎么能在这里循环?我的事件存储在MySQL中,我正在执行 $ number_of_events = $ result-&gt; num_rows 以确定返回的事件数。 - &gt;附加($ event#)会循环播放,直至总 $ number_of_events 被击中。

3 个答案:

答案 0 :(得分:2)

这称为方法链。该类的每个方法都通过$this返回被调用对象的实例,允许您堆叠方法调用。方法链接是可能的,因为该函数返回对象的引用。

因为类中支持方法链接的每个函数都返回调用对象,所以您只需将返回的对象重新分配回原始$calander变量;

 for ($inc = 0; $inc <= $number_of_events; $inc++) {
        if ($inc == $number_of_events) {
            $calander = $calander->attach($event1);
        }
        else {
            $calander = $calander->attach($event1);
        }
    }

此外,如果您想迭代变量名,可以在循环中使用变量变量;

$variable = "event".$inc;

$calander = $calander->attach($$variable);

所以这会变成$event0, $event1$event2等。

答案 1 :(得分:2)

循环问题是->运算符前面没有任何内容。 ->引用了对象的属性,但是没有为它提供对象。您可以通过将$calendar放在寂寞的运算符($calendar->...)前面来解决它,但它仍然不是非常漂亮的代码。

我建议这样做:

我认为你可以在循环中逐个添加事件我假设你已经用它来创建$event1$event2等等。我不知道你用的是什么从数据库中获取数据或表结构是什么样的,但我将提供MySQLi的示例。对其他替代方案应该很容易修改。

//Add the standards.
$calendar->standard('today')
    ->standard('prev-next')
    ->standard('holidays');

//Connect to the database here and query for the events using MySQLi.

//Loop through the results.
while($row = $result->fetch_assoc()) {
    //Create an event from the database row...
    $event = calendar->event()
         ->condition('timestamp', $row['TIMESTAMP'])
         ->title('Hello All', $row['TITLE'])
         ->output('My Custom Event', $row['OUTPUT']);
    //...and attach it.
    $calendar->attach($event);
}

这不是直接复制粘贴的代码,而是更多关于如何组织它的建议。

此外,对于将来,您不应将变量命名为$name1$name2等,然后使用$$来引用它们。请改用arrays

答案 2 :(得分:0)

这是解决方案。不知道为什么更改此选项以引用 $ calendar 每条线都有效,但确实如此。感谢大家。

$calendar->standard('today');
$calendar->standard('prev-next');
$calendar->standard('holidays');

for ($x = 1; $x <= $number_of_events; $x++) {
    $event_name = "event".$x;
    $calendar->attach($$event_name);
}