首頁 php教程 php手册 php 重载新的方法和类的继承

php 重载新的方法和类的继承

May 25, 2016 pm 04:46 PM
php 重載方法

PHP中的方法是不能重载的,所谓的方法重载就是定义相同的方法名,通过"参数的个数"不同或"参数的类型"不同,来访问我们的相同方法名的不同方法,继承是php5面象对象程序设计的重要特性之一,它是指建立一个新的派生类,从一个或多个先前定义的类中继承数据和函数,而且可以重新定义或加进新数据和函数,从而建立了类的层次或等级.

重载新的方法

在学习PHP 这种语言中你会发现,PHP中的方法是不能重载的,所谓的方法重载就是定义相同的方法名,通过"参数的个数"不同或"参数的类型"不同,来访问我们的相同方法名的不同方法.但是因为PHP是弱类型的语言,所以在方法的参数中本身就可以接收不同类型的数据,又因为PHP的方法可以接收不定个数的参数,所以通过传递不同个数的参数调用不相同方法名的不同方法也是不成立的.所以在PHP里面没有方法重载.不能重载也就是在你的项目中不能定义相同方法名的方法.另外,因为PHP没有名子空间的概念,在同一个页面和被包含的页面中不能定义相同名称的方法,也不能定义和PHP给我提供的方法的方法重名,当然在同一个类中也不能定义相同名称的方法.

我们这里所指的重载新的方法所指的是什么呢?其实我们所说的重载新的方法就是子类覆盖父类的已有的方法,那为什么要这么做呢?父类的方法不是可以继承过来直接用吗?但有一些情况是我们必须要覆盖的,比如说我们前面提到过的例子里面,"Person"这个人类里面有一个"说话"的方法,所有继承"Person"类的子类都是可以"说话"的,我们"Student"类就是"Person"类的子类,所以"Student"的实例就可以"说话"了,但是人类里面"说话"的方法里面说出的是"Person"类里面的属性,而"Student"类对"Person"类进行了扩展,又扩展出了几个新的属性,如果使用继承过来的"say()"说话方法的话,只能说出从"Person"类继承过来的那些属性,那么新扩展的那些属性使用这个继承过来的"say()"的方法就说不出来了,那有的人就问了,我在"Student"这个子类中再定义一个新的方法用于说话,说出子类里面所有的属性不就行了吗?一定不要这么做,从抽象的角度来讲,一个"学生"不能有两种"说话"的方法,就算你定义了两个不同的说话的方法,可以实现你想要的功能,被继承过来的那个"说话"方法可能没有机会用到了,而且是继承过来的你也删不掉.这个时候我们就要用到覆盖了.

虽然说在PHP里面不能定义同名的方法,但是在父子关系的两个类中,我们可以在子类中定义和父类同名的方法,这样就把父类中继承过来的方法覆盖掉了.

实例代码如下:

<?php
//定义一个"人"类做为父类
class Person {
    //下面是人的成员属性
    var $name; //人的名子
    var $sex; //人的性别
    var $age; //人的年龄
    //定义一个构造方法参数为属性姓名$name、性别$sex和年龄$age进行赋值
    function __construct($name, $sex, $age) {
        $this->name = $name;
        $this->sex = $sex;
        $this->age = $age;
    }
    //这个人可以说话的方法, 说出自己的属性
    function say() {
        echo "我的名子叫:" . $this->name . " 性别:" . $this->sex . " 我的年龄是:" . $this->age . "<br>";
    }
}
class Student extends Person {
    var $school; //学生所在学校的属性
    //这个学生学习的方法
    function study() {
        echo "我的名子叫:" . $this->name . " 我正在" . $this->school . " 学习<br>";
    }
    //这个学性可以说话的方法, 说出自己所有的属性,覆盖了父类的同名方法
    function say() {
        echo "我的名子叫:" . $this->name . " 性别:" . $this->sex . " 我的年龄是:" . $this->age . "我在" . $this->school . "上学.<br>";
    }
}
?>
登入後複製

上面的例子, 我们就在"Student"子类里覆盖了继承父类里面的"say()"的方法,通过覆盖我们就实现了对"方法"扩展.

但是,像这样做虽然解决了我们上面说的问题,但是在实际开发中,一个方法不可能就一条代码或是几条代码,比如说"Person"类里面的"say()"方法有里面有100条代码,如果我们想对这个方法覆盖保留原有的功能外加上一点点功能,就要把原有的100条代码重写一次, 再加上扩展的几条代码,这还算是好的,而有的情况,父类中的方法是看不见原代码的,这个时候你怎么去重写原有的代码呢?我们也有解决的办法,就是在子类这个方法中可以调用到父类中被覆盖的方法, 也就是把被覆盖的方法原有的功能拿过来再加上自己的一点功能,可以通过两种方法实现在子类的方法中调用父类被覆盖的方法:

一种是使用父类的 "类名::" 来调用父类中被覆盖的方法;

一种是使用 "parent::" 的方试来调用父类中被覆盖的方法;

实例代码如下:

<?php
class Student extends Person {
    var $school; //学生所在学校的属性
    //这个学生学习的方法
    function study() {
        echo "我的名子叫:" . $this->name . " 我正在" . $this->school . " 学习<br>";
    }
    //这个学性可以说话的方法, 说出自己所有的属性,覆盖了父类的同名方法
    function say() {
        //使用父类的"类名::"来调用父类中被覆盖的方法;
        //Person::say();
        //或者使用"parent::"的方试来调用父类中被覆盖的方法;
        parent::say();
        //加上一点自己的功能
        echo "我的年龄是:" . $this->age . "我在" . $this->school . "上学.<br>";
    }
}
?>
登入後複製

现在用两种方式都可以访问到父类中被覆盖的方法,我们选那种方式最好呢?用户可能会发现自己写的代码访问了父类的变量和函数.如果子类非常精炼或者父类非常专业化的时候尤其是这样. 不要用代码中父类文字上的名字,应该用特殊的名字 parent,它指的就是子类在 extends 声明中所指的父类的名字.这样做可以避免在多个地方使用父类的名字.如果继承树在实现的过程中要修改,只要简单地修改类中 extends 声明的部分.

同样,构造方法在子类中如果没有声明的话,也可以使用父类中的构造方法,如果子类中重新定义了一个构造方法也会覆盖掉父类中的构造方法,如果想使用新的构造方法为所有属性赋值也可以用同样的方式.

实例代码如下:

<?php
class Student extends Person {
    var $school; //学生所在学校的属性
    function __construct($name, $sex, $age, $school) {
        //使用父类中的方法为原有的属性赋值
        parent::__construct($name, $sex, $age);
        $this->school = $school;
    }
    //这个学生学习的方法
    function study() {
        echo "我的名子叫:" . $this->name . " 我正在" . $this->school . " 学习<br>";
    }
    //这个人可以说话的方法, 说出自己的属性
    function say() {
        parent::say();
        //加上一点自己的功能
        echo "我的年龄是:" . $this->age . "我在" . $this->school . "上学.<br>";
    }
}
?>
登入後複製

类的继承

继承作为面向对象的三个重要特性的一个方面,在面向对象的领域有着及其重要的作用,好像没听说哪个面向对象的语言不支持继承.继承是php5面象对象程序设计的重要特性之一,它是指建立一个新的派生类,从一个或多个先前定义的类中继承数据和函数,而且可以重新定义或加进新数据和函数,从而建立了类的层次或等级.说的简单点就是,继承性是子类自动共享父类数据结构和方法的机制,这是类之间的一种关系.在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并加入若干新的内容.比如你现在已经有一个"人"这个类了,这个类里面有两个成员属性"姓名和年龄"以及还有两个成员方法"说话的方法和走路的方法",如果现在程序需要一个学生的类,因为学生的也是人,所以学生也有成员属性"姓名和年龄"以及成员方法"说话的方法和走路的方法",这个时候你就可以让学生类来继承人这个类,继承之后,学生类就会把人类里面的所有的属性都继承过来,就不用你再去重新声明一遍这些成员属性和方法了,因为学生类里面还有所在学校的属性和学习的方法,所以在你做的学生类里面有继承自人类里面的属性和方法之外在加上学生特有的"所在学校属性"和"学习的方法",这样一个学生类就声明完成了,继函我们也可以叫作"扩展",从上面我们就可以看出,学生类对人类进行了扩展,在人类里原有两个属性和两个方法的基础上加上一个属性和一个方法扩展出来一个新的学生类.

通过继承机制,可以利用已有的数据类型来定义新的数据类型.所定义的新的数据类型不仅拥有新定义的成员,而且还同时拥有旧的成员.我们称已存在的用来派生新类的类为基类,又称为父类以及超类.由已存在的类派生出的新类称为派生类,又称为子类.

在软件开发中,类的继承性使所建立的软件具有开放性、可扩充性,这是信息组织与分类的行之有效的方法,它简化了对象、类的创建工作量,增加了代码的可重性.采用继承性,提供了类的规范的等级结构.通过类的继承关系,使公共的特性能够共享,提高了软件的重用性.

在C++语言中,一个派生类可以从一个基类派生,也可以从多个基类派生.从一个基类派生的继承称为单继承;从多个基类派生的继承称为多继承.

但是在PHP和Java语言里面没有多继承,只有单继承,也就是说,一个类只能直接从一个类中继承数据, 这就是我们所说的单继承.

例如:下面是"人"类的抽象

实例代码如下:

<?php
//定义一个"人"类做为父类
class Person {
    //下面是人的成员属性
    var $name; //人的名子
    var $sex; //人的性别
    var $age; //人的年龄
    //定义一个构造方法参数为属性姓名$name、性别$sex和年龄$age进行赋值
    function __construct($name, $sex, $age) {
        $this->name = $name;
        $this->sex = $sex;
        $this->age = $age;
    }
    //这个人可以说话的方法, 说出自己的属性
    function say() {
        echo "我的名子叫:" . $this->name . " 性别:" . $this->sex . " 我的年龄是:" . $this->age . "<br>";
    }
}
登入後複製

下面我们做一个"学生类", 如果不是用继承如下:

实例代码如下:

<?php
//定义一个"学生类"类做为父类
        class Student {
            //下面是人的成员属性
            var $name; //人的名子
            var $sex; //人的性别
            var $age; //人的年龄
            var $school; //学生所在学校的属性
            //定义一个构造方法参数为属性姓名$name、性别$sex和年龄$age进行赋值
            function __construct($name = "", $sex = "", $age = "", $school = "") {
                $this->name = $name;
                $this->sex = $sex;
                $this->age = $age;
                $this->school = $school;
            }
            //这个人可以说话的方法, 说出自己的属性
            function say() {
                echo "我的名子叫:" . $this->name . " 性别:" . $this->sex . " 我的年龄是:" . $this->age . "<br>";
            }
            //这个学生学习的方法
            function study() {
                echo "我的名子叫:" . $this->name . " 我正在" . $this->school . " 学习<br>";
            }
        }
        //定义一个子类"学生类"使用"extends"关键字来继承"人"类
        class Student extends Person {
            //学生所在学校的属性
            var $school;
            //这个学生学习的方法
            function study() {
                echo "我的名子叫:" . $this->name . " 我正在" . $this->school . " 学习<br>";
            }
        }
?>
登入後複製

通过上面"Student"类的定义,Student类通过使用"extends"这个关键字把Person类里的所有成员属性和成员方法都继承过来了,并扩展了一个所在学校成员属性"school",和一个学习方法"study()".现在子类"Student"里面和使用这个类实例出来的对象都具有如下的属性和方法:

学生类"Student"里面的成员属性有:

姓名:name;
年龄:age;
性别:sex;
学校:school;
学生类"Student"里面的成员方法有:
说话方法:say();
学习方法:study();
登入後複製


教程网址:

欢迎收藏∩_∩但请保留本文链接。

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南 適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南 Dec 24, 2024 pm 04:42 PM

PHP 8.4 帶來了多項新功能、安全性改進和效能改進,同時棄用和刪除了大量功能。 本指南介紹如何在 Ubuntu、Debian 或其衍生版本上安裝 PHP 8.4 或升級到 PHP 8.4

我後悔之前不知道的 7 個 PHP 函數 我後悔之前不知道的 7 個 PHP 函數 Nov 13, 2024 am 09:42 AM

如果您是經驗豐富的PHP 開發人員,您可能會感覺您已經在那裡並且已經完成了。操作

如何設定 Visual Studio Code (VS Code) 進行 PHP 開發 如何設定 Visual Studio Code (VS Code) 進行 PHP 開發 Dec 20, 2024 am 11:31 AM

Visual Studio Code,也稱為 VS Code,是一個免費的原始碼編輯器 - 或整合開發環境 (IDE) - 可用於所有主要作業系統。 VS Code 擁有大量針對多種程式語言的擴展,可以輕鬆編寫

在PHP API中說明JSON Web令牌(JWT)及其用例。 在PHP API中說明JSON Web令牌(JWT)及其用例。 Apr 05, 2025 am 12:04 AM

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

php程序在字符串中計數元音 php程序在字符串中計數元音 Feb 07, 2025 pm 12:12 PM

字符串是由字符組成的序列,包括字母、數字和符號。本教程將學習如何使用不同的方法在PHP中計算給定字符串中元音的數量。英語中的元音是a、e、i、o、u,它們可以是大寫或小寫。 什麼是元音? 元音是代表特定語音的字母字符。英語中共有五個元音,包括大寫和小寫: a, e, i, o, u 示例 1 輸入:字符串 = "Tutorialspoint" 輸出:6 解釋 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。總共有 6 個元

您如何在PHP中解析和處理HTML/XML? 您如何在PHP中解析和處理HTML/XML? Feb 07, 2025 am 11:57 AM

本教程演示瞭如何使用PHP有效地處理XML文檔。 XML(可擴展的標記語言)是一種用於人類可讀性和機器解析的多功能文本標記語言。它通常用於數據存儲

解釋PHP中的晚期靜態綁定(靜態::)。 解釋PHP中的晚期靜態綁定(靜態::)。 Apr 03, 2025 am 12:04 AM

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

什麼是PHP魔術方法(__ -construct,__destruct,__call,__get,__ set等)並提供用例? 什麼是PHP魔術方法(__ -construct,__destruct,__call,__get,__ set等)並提供用例? Apr 03, 2025 am 12:03 AM

PHP的魔法方法有哪些? PHP的魔法方法包括:1.\_\_construct,用於初始化對象;2.\_\_destruct,用於清理資源;3.\_\_call,處理不存在的方法調用;4.\_\_get,實現動態屬性訪問;5.\_\_set,實現動態屬性設置。這些方法在特定情況下自動調用,提升代碼的靈活性和效率。

See all articles