之前很多朋友可能会有疑惑,案例中魔兽争霸3游戏代码里,怎么那些步兵,远程兵攻击的逻辑都是打自己呢?
这是因为之前的Class学习中,都没有学习到关于Class与Class间的实例传递使用的知识。
当我们学会如果一个类传递给另一个类,就能够编写出正常的攻击逻辑了。
下面我们来看一段简单的案例代码,从中学会如何将class实例相互传递(为了代码量少,案例不使用继承,有兴趣的朋友可以自行修改学习):
<?php
# 生产商
class Produce {
public $obj; // 传递过来的实例
/**
* 将实例传递给我们
* @param object $obj 实例
*/
public function Demo($obj) {
$this->obj = $obj;
echo '我需要生产一辆:'.$this->obj->Name;;
}
}
# 保时捷零件批发商
class Porsche {
public $Name = '保时捷';
}
# 使用demo如下:
$Porsche = new Porsche();
$obj = new Produce();
$obj->Demo($Porsche);
上面的案例基本讲述了如果将实例化传递到另一个类中,但这时候出现了一个问题,
就是如果上面的代码,如果我不传递保时捷这个类过去,随便传递一个别的类,那Demo()方法不是有可能输出别的内容,
例如:我需要生产一辆雨伞?
为了避免出现这种低级错误,Class提供了一个实例引用规避的方法,就是在成员方法中传递参数时,声明一下对应的类,
这样传递给该传递的类实例,就一定要是这个声明的类或是该类继承下的子类。
其语法格式如下:
class 类名 {
控制权限 修饰符 function 方法名(声明类名 参数A, ...) {}
}
详细用法可以参考下列案例代码:
<?php
# 生产商
class Produce {
public $obj; // 传递过来的实例
/**
* 将实例传递给我们
* @param object $obj 实例,声明这个参数只能传递Porsche类或者其子类的实例
*/
public function Demo(Porsche $obj) {
$this->obj = $obj;
echo '我需要生产一辆:'.$this->obj->Name;;
}
}
# 保时捷零件批发商
class Porsche {
public $Name = '保时捷';
}
# 雨伞批发商
class Umbrella {
public $Name = '樱桃小雨伞';
}
# 使用demo如下:
$Porsche = new Porsche();
$obj = new Produce();
$obj->Demo($Porsche);
# 下面我们传递雨伞的实例过去,看看会不会报错
$Umbrella = new Umbrella();
$obj->Demo($Umbrella);