PHP中类及其继承关系

WBOY
リリース: 2016-06-06 20:12:17
オリジナル
1699 人が閲覧しました

类 讲继承,撇不开类,类一直是OOP中一非常重要的概念,在这个过度OOP的时代中,什么都得抽象成类,好像不抽象类就不会写代码了。所谓类,即一系列对象的总和,这系列对象有一样的属性和一样的方法。所谓方法,就是对象可以操作的行为:如可以吃、可以睡、可

PHP

讲继承,撇不开类,类一直是OOP中一非常重要的概念,在这个过度OOP的时代中,什么都得抽象成类,好像不抽象类就不会写代码了。所谓类,即一系列对象的总和,这系列对象有一样的属性和一样的方法。所谓方法,就是对象可以操作的行为:如可以吃、可以睡、可以计算等等。

<?php class Animal { 
    public $weight = 0;
    public function eat() { echo "it's eating!"; }
    private function sleep(){ echo "it's sleeping!"; }
}
$a = new Animal; // 或 new Animal();
$a->weight = 20;
$a->eat();
?>
ログイン後にコピー

这里表达的是一个简单的动物类,它有属性“体重”,有方法“吃”,“睡”。这些属性和方法,是类内部可见,还是类内部也可见。就有publicprivate关键字。 是外表上显而易见的,如手、脚、嘴、吃东西等,这些就是所谓public的;还有些外表上看不出来的,如心、肝、脾、心跳、消化等,这些就是所谓privateprotected。至于,privateprotected啥不一样,后面会讲。(modified 2014-5-1)

构造函数

我们可以按以下操作来实例化一个对象

<?php $a = new Animal; // 或 new Animal();
$a->weight = 20;
?>
ログイン後にコピー

但如果weight只可以内部访问或者想简化操作呢?那牛人又设计了构造函数__construct,这是一个特殊名字的方法。

<?php class Animal { 
    private $weight = 0;
    public function($weight) {
        $this->weight = $weight;
    }
    public function eat() { echo "it's eating!"; }
    private function sleep(){ echo "it's sleeping!"; }
}
$a = new Animal(20);
?>
ログイン後にコピー

继承

有了类以后,在类与类之间找关系,继承就是一个明显的关系。所谓继承,不是简单的生物学中的基因继承,也不是经济学中的财产继承。它只是表达了一个概念,你有的我也有,你没有的我也有。与其说是继承,不如说是扩展。包括PHP在内的许多语言,都选择关键字extends就是想很清楚地表达了这个概念它。派生关系可以用家族树来表达,确实就像继承。(modified 2014-5-1)

<?php class People extends Animal { // 类也是动物
    protected $IQ = 0;
    public function think() {echo "it's thinking!";}
}
?>
ログイン後にコピー

以上表达的就是人是继承了动物的方法“吃”,“睡”。但人不只“吃睡”,还会“思考”,所以还有智商“IQ”。那有些属性、方法不想被类外部访问,又想被继承它的类访问怎么办,好吧,再搞个protected关键字好了。 好吧,既然是继承,那我们来研究一下达尔文的进化和退化论。派生类于基类,多了新的属性或新的方法,即是进步;少了在基类中声明为private的属性和方法,即为退化。(modified 2014-5-1)

好吧,继承并不复杂,以上的public, protected等,我随便写的,没逻辑的。

抽象类

这节比较抽象,我们来讲故事吧!(modified 2014-5-1)

上帝在造万物时,想造生物,生物有生命会呼吸,然后好抽象,不懂造。(抽象基类,有抽象方法呼吸)

然后,上帝说,我们来造鸟,鸟是生物,有两只脚,有翅膀,会飞,用肺呼吸,羽毛什么颜色?长什么样子?好抽象,不会造。(派生抽象类)

上帝说,好吧,我们来造燕子,燕子是鸟,黑色毛,尾毛像剪刀。然后,捏完上色,好具体。(类)

然后,上帝用抽象到具体的方法,创造世界上最大的操作系统,Hello World!

<?php abstract class Life {
    abstract function breathing();
}
abstract class Bird extends Life {
    $foots = array();
    $wings = array();
    function breathing() { echo "with lump!"; }
    abstract function feather();
    function fly() { echo "flying!"; }
} 
class Swallow Extends Bird () {
    $foots = array();
    $wings = array();
    function breathing() { echo "with lump!"; }
    abstract function feather() { echo "black and like a cicor!"}
    function fly() { echo "flying!"; }
}
?>
ログイン後にコピー

静态方法、属性

从C/C++时代就想怎么去解释去解释这个静态两个字,这很计算机表达,因为他把变量和方法存在程序的静态区,所以叫静态变量和静态方法。我一直在想这东西在类中表达怎么跟现实中结合,让我们更好地去理解它然后更好地使用它。 OK。想想,有一个People类,关于人类有什么属性和什么操作跟一个人的生命没关系的?人类有多少人,生成身份ID。

<?php class People extends Animal {
    function eat() {echo "we'are eating tasty food!"}
    function __construct() {
        $this->ID = self::create_id(); // 内部调用静态属性/方法
    }
    static $populace; // 静态属性,人口
    static function() create_id { return microtime(); } // 静态方法,生成身份证
}
echo "Populace: " . People::$populace; // 外部调用静态属性/方法
?>
ログイン後にコピー

To be continue

由于明天还有重要的事,今天只讲到这里,这里只是热身,精彩的内容在后面。

( 完 )

版权所有:老白经 转载请保留来源信息。 >

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート