如何在此OOP情况下检索数组? [PHP]

时间:2017-09-10 14:28:24

标签: php oop

虽然我知道如何在程序PHP中解决这个问题,但我对OOP有困难。一些代码行缩短了(例如html)。

因此,用户输入一个数字,$ army1在创建自己时传递给构造函数。我的构造函数使用for循环($ filled_army)填充数组,但我不知道如何以正确的方式检索它(因此我可以将其打印出来),因为构造函数没有返回值? 在构造函数中添加print_r($filled_army);将打印出值,仅举几例。

另外,如果不能通过__construct解决这个问题,有人可以帮助我通过我自己的课程方法来解决这个问题吗?我猜它应该用吸气剂和放大器完成。 setters,但我也有使用它们的问题,因为一个变量在index.php中传递,而其他变量($ filled_army)是类的属性...

的index.php

<form>
  <input type="number" name="size">
</form>

<?php
    $army1 = new Army($_GET['size']);
    // $army1->getArmy(); ??
?>

army.class.php

<?php
class Army {
  public $filled_army = [];
  public size;
  //...
  public function __construct($size){
        $this->size = $size;
        $arrayOfSoldiers = [10,20,30];

        for($i=0; $i<$size; $i++)
        {
            $filled_army[$i] = $arrayOfSoldiers[mt_rand(0, count($arrayOfSoldiers) - 1)];
        }
    }
}
?>

1 个答案:

答案 0 :(得分:0)

由于您已将$filled_army属性声明为public,因此在使用PHP中的标准对象表示法进行实例化后,它将立即可用,例如:

$army1 = new Army($_GET['size']);
$army1->filled_army; // Now contains your array;

但是,将属性的可见性设置为public意味着任何代码都可以修改属性,而不仅仅是它创建的对象。通常,要解决此问题,我们将属性设置为protectedprivate,然后使用getter / setter:

class Army
{
  private $filled_army = [];
  private $army_size   = 0;

  private static $_soldiers = [ 10, 20, 30 ];

  function __construct($size)
  {
    $this->army_size = $size;

    for($i = 0; $i < $size; $i++)
    {
      $this->filled_army[] = self::$_soldiers[ mt_rand(0, count(self::$_soldiers) - 1) ];
    }
  } 

  // Getter for the army:
  public function getArmy()
  {
    return $this->filled_army;
  }

  // Getter for the size:
  public function getArmySize()
  {
    return $this->army_size;
  }
}

现在,我们可以访问getArmy()方法(或类似getArmySize()方法):

$army1 = new Army($_GET['size']);
$army1->getArmy();     // Returns the army
$army1->getArmySize(); // Returns the value of $_GET['size'];

值得注意的是,PHP支持Magic Getters/Setters,这可能对您的项目有用。

另请注意,我们不需要构造函数的可见性修饰符(PHP中的__construct() 始终公开可见)。