访问父类

时间:2016-08-11 11:08:34

标签: php class

所以,假设我在一个文件中有这个虚拟代码:

<?php
class Dice
{
    public $maxPossibleNo;
    public $secretNumber;

    function __construct($no_of_dice=1) 
    {
        // how many possible dice number to enroll
        $this->maxPossibleNo = $no_of_dice * 6;

        // do shaking dice
        $this->secretNumber = $this->getSecretNumber();
    }

    function getSecretNumber() 
    {
        return rand(1, $this->maxPossibleNo);
    }

    function roll() 
    {
        $found = false;
        list($array1, $array2) = array_chunk(range(1, $this->maxPossibleNo), ceil($this->maxPossibleNo/2));
        /*
            Array
            (
                [0] => 1
                [1] => 2
                [2] => 3
            )
            Array
            (
                [0] => 4
                [1] => 5
                [2] => 6
            )
        */

        $guess = new Guess();
        echo $this->secretNumber;
        echo $guess->checkSecretNumber();
    }
}

class Guess extends Dice
{
    function checkSecretNumber() 
    {
        return $this->secretNumber;
    }

    function isGreaterThan($x) 
    {
        return $x > $this->secretNumber;
    }

    function isLessThan($x) 
    {
        return $x < $this->secretNumber;
    }

    function isEqual($x) 
    {
        return $x == $this->secretNumber;
    }
}

$game = new Dice('1');
$game->roll();

结果:

65
43
54

预期结果:

66
33
55

我希望Guess类能够访问Dice类的密码而无需再次滚动它。所以我可以用其他函数操作Guess类。

编辑:

  

期望流程:主类只会调用一次(生成   秘密号码),而我将需要进行循环检查   秘密号码多次。 (我想方法是创造另一个   它的类,它将能够被重复调用为auto   检查目的,但我在这里做错了,没有任何想法   如何纠正这一部分。)

任何建议的更正都将受到赞赏。

谢谢

1 个答案:

答案 0 :(得分:0)

当你创建一个新的Guess()时,它自动运行Dice的构造函数,因为Guess扩展了骰子。 Guess实例中的密码不是第一个Dice实例的密码,它是一个单独的实例。我认为你的设计存在缺陷。为什么Guess需要扩展Dice?猜测在逻辑上不是骰子的不同实现(这是你(逻辑上)通常使用子类的)。

以下是我将如何做到这一点(不知道你想要实现的目标):

<?php
class Dice
{
  public $maxPossibleNo;
  public $secretNumber;

  function __construct($no_of_dice=1) 
  {
    // how many possible dice number to enroll
    $this->maxPossibleNo = $no_of_dice * 6;

    // do shaking dice
    $this->secretNumber = $this->getSecretNumber();
  }

  function getSecretNumber() 
  {
    return rand(1, $this->maxPossibleNo);
  }

  function roll() 
  {
    $found = false;
    list($array1, $array2) = array_chunk(range(1, $this->maxPossibleNo), ceil($this->maxPossibleNo/2));
    /*
        Array
        (
            [0] => 1
            [1] => 2
            [2] => 3
        )
        Array
        (
            [0] => 4
            [1] => 5
            [2] => 6
        )
    */
  }
}

class Guess
{
  private $dice;

  function __construct(Dice $d)
  {
    $this->dice = $d;
  }

  function checkSecretNumber() 
  {
    return $this->dice->secretNumber;
  }

  function isGreaterThan($x) 
  {
    return $x > $this->dice->secretNumber;
  }

  function isLessThan($x) 
  {
    return $x < $this->dice->secretNumber;
  }

  function isEqual($x) 
  {
    return $x == $this->dice->secretNumber;
  }
}

$dice = new Dice('1');
$dice->roll();
$guess = new Guess($dice);
echo $dice->secretNumber;
echo $guess->checkSecretNumber();