如果机枪兵$m1攻击敌人的时候,可以这样使用对象的方法:
<?php $m1->attack($z1);//假设攻击的是某个小狗的对象$z1 ?>
不同的类内可以用同名的函数,比如小狗的类Zergling里面也可以有一个函数attack
要注意的是,从PHP5开始,无论在哪里改变一个对象的属性,都能改变它。比如上面一个小狗对象被作为参数传入机枪兵的attack函数,执行函数之后这个小狗对象的血减少了,这和一般的函数不同。但这是很直观的,如果一个小狗被攻击了,它的血就应该减少。
二、构造函数和析构函数
每次我们新建一个机枪兵的时候,总人口应该加1,如果一个机枪兵被杀,人口应该减少1。
可以通过构造函数和析构函数来自动处理:
<?php class marine { //构造函数 function __construct() { //增加总人口的代码 } //析构函数 function __destruct() { //减少总人口的代码 } } ?>
在一个类中,名字为__construct的函数叫做构造函数,每次new新建一个类的对象的时候就会执行:
<?php $m1 = new marine();//每次制造一个机枪兵时系统会调用类marine的构造函数,自动增加总人口 ?>
在一个类中,名字为__destruct的函数叫做析构函数,每次销毁一个类的对象的时候就会执行:
<?php unset($m1);//unset可以用于对象,表示销毁一个对象。每次一个机枪兵被杀时系统会调用类marine的析构函数,自动减少总人口 ?>
三、静态
机枪兵的攻击力是属于所有机枪兵对象,每个机枪兵的攻击力都是一样的,如果升级,应该一起变化。
这就用到static,表示静态:
<?php class marine { static $attackNumber = 10; //攻击力的数字 //这个函数表示攻击敌人时候的运行代码 function attack($enemy) { //攻击敌人的代码,$enemy->blood表示敌人对象的血属性 $enemy->blood -= self::$attackNumber; } } ?>
静态属性表示类所有的对象都共享的属性,一旦改变,所有的对象都跟着变化。
静态属性用static开头,比如上面的static $attackNumber。
静态属性可以用类直接访问:
<?php echo marine::$attackNumber;//显示10 ?>
如果类以内的函数访问,用self::$attackNumber表示本类的$attackNumber属性
所以如果我们升级了机枪兵的攻击力,所有的机枪兵都受影响,这就是面向对象的好处之一,也解决了我们前面讨论的共同数据的问题。