我正在玩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 被击中。
答案 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);
}