之前很多朋友可能会有疑惑,案例中魔兽争霸3游戏代码里,怎么那些步兵,远程兵攻击的逻辑都是打自己呢?
    这是因为之前的Class学习中,都没有学习到关于Class与Class间的实例传递使用的知识。
    当我们学会如果一个类传递给另一个类,就能够编写出正常的攻击逻辑了。
    下面我们来看一段简单的案例代码,从中学会如何将class实例相互传递(为了代码量少,案例不使用继承,有兴趣的朋友可以自行修改学习):

    1. <?php
    2. # 生产商
    3. class Produce {
    4. public $obj; // 传递过来的实例
    5. /**
    6. * 将实例传递给我们
    7. * @param object $obj 实例
    8. */
    9. public function Demo($obj) {
    10. $this->obj = $obj;
    11. echo '我需要生产一辆:'.$this->obj->Name;;
    12. }
    13. }
    14. # 保时捷零件批发商
    15. class Porsche {
    16. public $Name = '保时捷';
    17. }
    18. # 使用demo如下:
    19. $Porsche = new Porsche();
    20. $obj = new Produce();
    21. $obj->Demo($Porsche);

    上面的案例基本讲述了如果将实例化传递到另一个类中,但这时候出现了一个问题,
    就是如果上面的代码,如果我不传递保时捷这个类过去,随便传递一个别的类,那Demo()方法不是有可能输出别的内容,
    例如:我需要生产一辆雨伞?
    为了避免出现这种低级错误,Class提供了一个实例引用规避的方法,就是在成员方法中传递参数时,声明一下对应的类,
    这样传递给该传递的类实例,就一定要是这个声明的类或是该类继承下的子类。
    其语法格式如下:

    1. class 类名 {
    2. 控制权限 修饰符 function 方法名(声明类名 参数A, ...) {}
    3. }

    详细用法可以参考下列案例代码:

    1. <?php
    2. # 生产商
    3. class Produce {
    4. public $obj; // 传递过来的实例
    5. /**
    6. * 将实例传递给我们
    7. * @param object $obj 实例,声明这个参数只能传递Porsche类或者其子类的实例
    8. */
    9. public function Demo(Porsche $obj) {
    10. $this->obj = $obj;
    11. echo '我需要生产一辆:'.$this->obj->Name;;
    12. }
    13. }
    14. # 保时捷零件批发商
    15. class Porsche {
    16. public $Name = '保时捷';
    17. }
    18. # 雨伞批发商
    19. class Umbrella {
    20. public $Name = '樱桃小雨伞';
    21. }
    22. # 使用demo如下:
    23. $Porsche = new Porsche();
    24. $obj = new Produce();
    25. $obj->Demo($Porsche);
    26. # 下面我们传递雨伞的实例过去,看看会不会报错
    27. $Umbrella = new Umbrella();
    28. $obj->Demo($Umbrella);