mumudontcry 发表于 2017-3-28 12:29:17

【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:43

为图片点一个赞^_^

mumudontcry 发表于 2017-3-28 21:24:45

人造人 发表于 2017-3-28 13:35
为图片点一个赞^_^

不能光看图片~~

人造人 发表于 2017-3-28 21:36:54

mumudontcry 发表于 2017-3-28 21:24
不能光看图片~~

^_^

lyzklkl 发表于 2017-3-29 10:17:15

哇,这个系列的作业好有趣,到时候去学习一下,现在在学习python。。。
页: [1]
查看完整版本: 【php包教不包会系列12】PHP 类型之类和继承