递归对象实例化(在PHP中)



所以在我的PHP程序中,我正在创建一个日历功能,其中一个类是"日历日";。我想做的是能够为每一天的计数实例化一个新的日期,例如new CalendarDay (22)意味着新的月22日。还有一个show()函数用于显示每一天。类本身功能正常,但当我尝试使用递归实例化新的日子时,它似乎不再起作用,因为与实例化对象相关的一切都从网页中消失了。

class CalendarDay{
private $current_month;
private $current_year;
private $current_date;
public $reminderSet;
public $reminders;
public function __construct($current_day_of_month){
$current_year = date("Y");
$current_month = date("m");
$this->days_in_month = cal_days_in_month(CAL_GREGORIAN, $current_month, $current_year);
$this->current_date = date("d");
$this->current_day_of_month = $current_day_of_month;
}
public function show(){
$output = '<div class = "generator>"';
//$output .= $this->current_date;
//$output .= '<h1>' . $this->current_date . '</h1>';
$output .= '</div>';
$output .= $this->current_day_of_month;
echo $output;
}
}

我的递归尝试失败:

for ($countTo31 == 0; $countTo31 == 31; $countTo31++){
$holder = $countTo31;
$date = new CalendarDay ($holder);
$date->show();
}

作为参考,这个没有递归的原始代码块正常工作:

$holder = $countTo31;
$date = new CalendarDay ($holder);
$date->show();

我对你想要实现的目标感到非常困惑。。。

你有一个";"天";类,它接受输入来初始化特定的一天,但实际上是基于date("Y-m-d");计算出当前的一天?。。然后输出输入日期?

老实说,这看起来更像是你想要一个";月份;目标

初始问题

  1. 您使用==定义您的起点

    • ==不是赋值运算符,它是一个比较运算符。

    • 它有效地在循环开始时添加了循环的额外迭代

      for($i == 1; $i < 5; $i++){
      echo $i;
      }
      // Loop 1:
      //    --> Notice on $i == 1
      //    --> Notice on $i < 5
      //    --> Notice on echo $i
      //    --> Notice on $i++
      // Loop 2:
      --> $i = 1 BECAUSE of the previous $i++
      so the intended loop starts...
      
    • 另外,在这种情况下,循环应该以1而不是0(!(开始

  2. 您使用==来定义您的条件

    • for循环像您的循环一样有效地工作:

      for ( A ; B ; C ){
      // Do something...
      }
      // Loop works as:
      //     Check A against B
      //     If TRUE then "Do something..."
      //         and then do C
      //     IF FALSE then break
      
    • 然而,即使你的分配(A(是正确的(即$countTo31 = 1(,它仍然不会起作用,因为1 !== 31和之前的循环breaks从开始

    • 应该是$countTo31 <= 31

  3. 在对象上循环,重写变量

    • 您的代码当前重写了包含每个循环的日期对象的变量
    • 实际上,你创建了一个对象来输出当天的数据,并立即删除该对象,使其不能用于其他任何事情
  4. 您的HTML输出在错误的位置有一个"

    $output = '<div class = "generator>"';
    //Should be...
    $output = '<div class = "generator">';
    
  5. 类中的一些变量没有正确分配或声明

    • $current_month已声明但从未赋值
    • $current_year已声明但从未赋值
    • $current_day_of_month已分配但未声明
    • $days_in_month已分配但未声明

临时解决方案

如果没有关于你打算做什么的进一步信息,就不可能提供良好/准确的指导,所以我将留下一个工作示例,告诉你该做什么:

$days_in_month = cal_days_in_month(
CAL_GREGORIAN,
date("m"),
date("Y")
);
for ($day = 1; $day <= $days_in_month; $day++){
echo "Day {$day}<br>";
}

提议的变更

看起来你并不是真的想要一个";"天";类,用于尝试实现的函数。因此,在我看来,最好先创建一个";月份;对象与一个月中的所有日子,然后使其生成一个";"天";对象,然后可以收集每天的信息,例如提醒。

通过这种方式,您可以在处理用户输入或数据库数据时每天进行更新。

class Month
{
private $month;
private $year;
private $days = [];
public function __construct($month, $year)
{
$this->month    = $month;
$this->year     = $year;
$number_of_days = cal_days_in_month(
CAL_GREGORIAN,
$month,
$year
);
for ($i = 1; $i <= $number_of_days; $i++){
$date = "{$this->year}-{$this->month}-{$i}";
// $days[] = new Day($date);
$this->days[$i] = new Day($date);
}   
}
public function getDay($day)
{
return $this->days[$day];
}
public function getNumberOfDays()
{
return count($this->days);
}
}
class Day
{
private $date;
private $reminders = [];

public function __construct($date)
{
$this->date = $date;
// Initialise day...
# Get reminders
# Get meetings
# Get bills to pay
}
public function getReminders()
{
return $this->reminders;
}
public function setReminder($content, $time)
{
// Set reminders
$this->reminders[] = [
"content" => $content,
"time"    => $time
];
}
public function show()
{
return date("d / m / Y", strtotime($this->date));
}
}
$month = new Month(12, 2020);
for ($i = 1; $i <= $month->getNumberOfDays(); $i++){
echo $month->getDay($i)->show()."<br>";
}

相关内容

  • 没有找到相关文章

最新更新