【php包教不包会系列12】PHP 类型之类和继承
本帖最后由 mumudontcry 于 2017-3-28 12:31 编辑PHP 对象
要创建一个新的对象 object,使用 new 语句实例化一个类:
<?php
class Demo
{
function test()
{
echo "我是函数";
}
}
$obj = new Demo;
$obj->test();
这个例子告诉我们,PHP 的对象需要 PHP 的类实例化得到,不同于其他语言(比如 Javasscirpt),在 Javascript 里,对象由一对花括号来定义
所以,我们这里要事先知道 PHP 类的定义
PHP 类
每个类的定义都以关键字 class 开头,后面跟着类名,后面跟着一对花括号,里面包含有类的属性与方法的定义
类名可以是任何非 PHP 保留字的合法标签。一个合法类名以字母或下划线开头,后面跟着若干字母,数字或下划线
一个类可以包含有属于自己的常量,变量(称为“属性”)以及函数(称为“方法”)。
在上面例子中,test 函数(类里我们叫它为方法),需要通过实例化类后得到的 $obj 对象去调用
如果想在类的内部调用一个函数,可以使用 PHP 类的伪变量 $this,通过这个变量,你可以访问该类的方法,属性
<?php
class Demo {
...code...
function test2() {
$this->test();
}
}
这里,我们通过 $this ,在 Demo 类的 test2 方法里,调用了之前已经定义的 test 方法,使用 $obj 对象调用 test2,你会得到和 test 方法一样的结果
创建一个类必须使用 new 关键字,此时会创建得到 new 之后的字符串(不带引号)代表的类,当然,你也可以用一个变量去代替这个字符串
<php
...code...
$name = 'Demo';
$obj2 = new $name();
就像上面那样去实例化一个类也是可以的,这个效果和 $obj 得到的对象等价
类的继承
一个类可以在声明中用 extends 关键字继承另一个类的方法和属性。PHP不支持多重继承,一个类只能继承一个基类
被继承的方法和属性可以通过用同样的名字重新声明被覆盖。但是如果父类定义方法时使用了 final,则该方法不可被覆盖。可以通过 parent:: 来访问被覆盖的方法或属性
当覆盖方法时,参数必须保持一致否则 PHP 将发出 E_STRICT 级别的错误信息。但构造函数例外,构造函数可在被覆盖时使用不同的参数
<?php
class A {
public $name;
public function test(){
echo 'A';
}
}
class B extends A {
public $name = 'b';
public function test(){
parent::test();
echo 'B';
}
}
$a = new A;
$a->test();
$b = new B;
$b->test();
我们实例化了一个 A 类的对象 $a,然后执行了它的方法 test,此时会输出“A”
我们又实例化了一个继承自 A类的 B 类的对象 $b,然后执行了它的方法 test,由于 B 类的 test 方法里调用了 A 的test,因此,会输出“AB”
类的意义和创建
类代表的是一类事物的集合,我们可以把具有相同属性、操作的事务放在一个类里,例如
人和单身狗都有嘴巴,有手,可以吃饭,睡觉,那么,这个时候我们可以创建两个类
<?php
class Person{
public $hand;
public function eat(){
}
}
class SingleDog{
public $hand;
public function eat(){
}
}
这个时候我们如果 new 这两个类,就可以得到人和单身狗的一个对象(不是找对象的对象啊),他们分别有手,以及,吃饭的能力
但是很多人不同意了,人和单身狗是有区别的,所以,我们这里再改造一下
<?php
class Person{
public $hand;
public function eat(){
}
public function girlFriend(){
}
}
class SingleDog{
public $hand;
public function eat(){
}
}
此时,人比单身狗多了一个方法,叫做“女朋友”
众人:啥?你是在侮辱没有女朋友就不是人嘛?我:哦……你这么理解我也没办法
这样其实就已经基本模拟了现实生活中的两类人了,只不过有没有发现一个问题,刚才也有人发现了,单身狗也是人啊,凭什么说没有女朋友就不是人
嗯……
所以,我们为了强调,单身狗其实也是人的一个种类,我们使用继承,我们继续改造:
<?php
class Person{
public $hand;
public function eat(){
}
public function girlFriend(){
return true;
}
}
class SingleDog extends Person{
public function girlFriend(){
return false;
}
}
这时候,由于 Person,也就是人的这个类,是父类,子类“单身狗”自然就有女朋友了,等等!肯定所有人都不服气了,因此,我们可以在单身狗的女朋友方法里,返回 false,相当于重写了这个方法,毕竟,我们知道,女朋友不是所有人都有的!
但是问题又来了,这样我就一定要在单身狗的类里重写女朋友这个方法,很明显,单身狗是连这个方法也不应该存在的啊!我们继续改造
<?php
class Person{
public $hand;
public function eat(){
}
}
class SingleDog extends Person{
}
class DoubleDog extends Person{
public function girlFriend(){
}
}
这个时候我们再写一个类,叫做 DoubleDog,额,至于什么意思,你们自己看,我也不知道(嘻嘻),这个类里有一个女朋友的方法,我们把 Person 里的女朋友移动到这里来了,说明,女朋友对于一个人这个集合来说,不是必须的,这样的话,我们就定义了三个类,分别表示三类人,而且也刚好符合这三类人的特点
继承可以把父类的方法属性都拿过来,但是,如果有一些方法或者属性的确不适合作为父类的方法或者属性,那你应该再定义一个类
作业
玩过 LOL 的小伙伴,能不能把木木最喜欢的琴女和放在一个类里?这样木木就可以随时随地,new ~~一个琴女出来啦
#################### 华丽的 PHP 版分割线 ####################
如果喜欢木木的讲解,就点击下方的订阅(读作:打赏),给木木点个赞吧,欢迎大家提出建议或者指正
一块钱买不了皮肤,买不了香烟,却可以跟着木木一起打怪升级,并给木木巨大的支持,有了大家的力量,木木就可以制造元气弹,打败……嗯,买一个好一点的女朋友啦
为图片点一个赞^_^ 人造人 发表于 2017-3-28 13:35
为图片点一个赞^_^
不能光看图片~~ mumudontcry 发表于 2017-3-28 21:24
不能光看图片~~
^_^ 哇,这个系列的作业好有趣,到时候去学习一下,现在在学习python。。。
页:
[1]