PHP类继承 extends使用介绍


Posted in PHP onJanuary 14, 2014

出来工作这么久了,项目经验倒是不少,但是当问及底层的东西时候,常常是一言不发了。现在项目设计底层的东西越来越少,可以说是真正用到的也就是那么一点,真正核心的东西都已经被框架封装好了。总感觉自己一直进步很慢,关于底层设计思想,常常也只可意会。随着时间的流逝,我们常常会感慨书到用时方恨少了,接下来一定要恶补设计思想了。

今天先来复习一下类继承。

类继承很重要,作为程序员也基本每天都会和他打交道,但是有些东西你真的都知道吗?下面是从官网上面看到的。

一个类可以在声明中用 extends,关键字继承另一个类的方法和属性。PHP不支持多重继承,一个类只能继承一个基类。

被继承的方法和属性可以通过用同样的名字重新声明被覆盖。但是如果父类定义方法时使用了 final,则该方法不可被覆盖。可以通过 parent:: 来访问被覆盖的方法或属性。

当覆盖方法时,参数必须保持一致否则 PHP 将发出 E_STRICT 级别的错误信息。但构造函数例外,构造函数可在被覆盖时使用不同的参数。

关于基本的概念想必大家都会知道,但是对于final和parent::在项目中我还真没有怎么使用过,惭愧啊。
下面主要说一下这两个关键字的用途吧。

Final 关键字

PHP 5新增的一个关键字,如果父类中的方法被声明为 final,则子类无法覆盖该方法。同样如果一个类被声明为 final,则不能被继承。
需要注意的是: 属性不能被定义为 final,只有类和方法才能被定义为 final。

范围解析操作符(::)

范围解析操作符或者更简单地说是一对冒号,可以用于访问静态成员,类常量,还可以用于覆盖类中的属性和方法。
self,parent 和 static 这三个特殊的关键字是用于在类定义的内部对其属性或方法进行访问的。

当一个子类覆盖其父类中的方法时,PHP 不会调用父类中已被覆盖的方法。是否调用父类的方法取决于子类。这种机制也作用于构造函数和析构函数,重载以及魔术方法。

下面是调用父类的方法的一个示例:

<?php
class MyClass
{
    protected function myFunc() {
        echo "MyClass::myFunc()\n";
    }
}
class OtherClass extends MyClass
{
    // 覆盖了父类的定义
    public function myFunc()
    {
        // 但还是可以调用父类中被覆盖的方法
        parent::myFunc();
        echo "OtherClass::myFunc()\n";
    }
}
$class = new OtherClass();
$class->myFunc();
/**
 * 输出结果 ->
 * MyClass::myFunc()
 * OtherClass::myFunc()
 */
?>

当在类定义之外引用到这些项目时,要使用类名。

::class 自 PHP 5.5 起,关键词 class 也可用于类名的解析。使用 ClassName::class 你可以获取一个字符串,包含了类 ClassName 的完全限定名称。这对使用了 命名空间 的类尤其有用。这些可能就是以后要讨论的话题了,关于这个概念那就是以后要讨论的了,现在我们还在使用php5.3。

不过说句实话,有一些关键字在小项目中确实是很难使用,不过我想多了解一些总还是需要的。尤其是当你使用一些第三方的类库时候,当你细细研究他的程序逻辑,你总能学点东西。尽管有些东西你长时间不用,可能就忘记了,但是毕竟他曾经在你脑海里经过过,总会为以后的人生留点痕迹。

最后废话不多说了,分享一段范围解析操作符(::)应用的代码,你们也来感受下:

<?php
class cA
{
    /**
     * 直接使用的测试属性的默认值
     */
    protected static $item = 'Foo';
    /**
     * 间接使用的测试属性的默认值
     */
    protected static $other = 'cA';
    public static function method()
    {
        print self::$item."\r\n";
        print self::$other."\r\n";
    }
    public static function setOther($val)
    {
        self::$other = $val;
    }
}
class cB extends cA
{
    /**
     * 重定义测试属性的默认值
     */
    protected static $item = 'Bar';
    public static function setOther($val)
    {
        self::$other = $val;
    }
    /**
     * 不重新声明 method()方法
     */
}
class cC extends cA
{
    /**
     * 重定义测试属性的默认值
     */
    protected static $item = 'Tango';
    public static function method()
    {
        print self::$item."\r\n"; 
        print self::$other."\r\n"; 
    }
    /**
     * 不重新声明 setOther()方法
     */
}
class cD extends cA
{
    /**
     * 重定义测试属性的默认值
     */
    protected static $item = 'Foxtrot';
    /**
     * 不重新声明 任何方法来实现上述过程
     */
}
cB::setOther('cB'); //  cB::method()!
cB::method(); // cA::method()!
cC::setOther('cC'); // cA::method()!
cC::method(); // cC::method()!
cD::setOther('cD'); // cA::method()!
cD::method(); // cA::method()!
/**
 * 输出结果 ->
 * Foo
 * cB
 * Tango
 * cC
 * Foo
 * cD
 */
?>

PHP extends类继承代码示例:

< ?php   
class a{   
public $x;   
public $y;   
function __construct($x=0,$y=0){   
$this->x=$x;   
$this->y=$y;   
}   
function getx(){   
return $this->x;   
}   
function gety(){   
return $this->y;   
}   
function __destruct(){}   
}   
class a2 extends a{}   
/*extends是一个继承函数*/   
$b2=new a2(10,10);   
echo $b2->getx()."<br>";   
echo $b2->gety();   
?>

以上介绍的内容就是PHP extends类继承的全部实现步骤。
PHP 相关文章推荐
《PHP边学边教》(04.编写简易的通讯录――视频教程1)
Dec 13 PHP
逐步提升php框架的性能
Jan 10 PHP
php 删除无限级目录与文件代码共享
Nov 22 PHP
PHP has encountered an Access Violation at 7C94BD02解决方法
Aug 24 PHP
PHP 文件上传全攻略
Apr 28 PHP
Php Ctemplate引擎开发相关内容
Mar 03 PHP
PHP utf-8编码问题,utf8编码,数据库乱码,页面显示输出乱码
Apr 08 PHP
PHP 解决session死锁的方法
Jun 20 PHP
php 伪造ip以及url来路信息方法汇总
Nov 25 PHP
使用PHP接受文件并获得其后缀名的方法
Aug 05 PHP
深入解析WordPress中加载模板的get_template_part函数
Jan 11 PHP
弹出模态框modal的实现方法及实例
Sep 19 PHP
那些年我们错过的魔术方法(Magic Methods)
Jan 14 #PHP
PHP mail()函数使用及配置方法
Jan 14 #PHP
PHP 登录完成后如何跳转上一访问页面
Jan 14 #PHP
PHP四舍五入精确小数位及取整
Jan 14 #PHP
利用yahoo汇率接口实现实时汇率转换示例 汇率转换器
Jan 14 #PHP
php的一个简单加密解密代码
Jan 14 #PHP
PHP随机生成随机个数的字母组合示例
Jan 14 #PHP
You might like
几个有用的php字符串过滤,转换函数代码
2012/05/01 PHP
设置php页面编码的两种方法示例介绍
2014/03/03 PHP
Mac系统下安装PHP Xdebug
2018/03/30 PHP
Laravel框架源码解析之模型Model原理与用法解析
2020/05/14 PHP
基于jquery的让页面控件不可用的实现代码
2010/04/27 Javascript
jquery创建并行对象或者合并对象的实现代码
2012/10/10 Javascript
如何让浏览器支持jquery ajax load 前进、后退功能
2014/06/12 Javascript
json属性名为什么要双引号(个人猜测)
2014/07/31 Javascript
JavaScript实现标题栏文字轮播效果代码
2015/10/24 Javascript
轻松学习jQuery插件EasyUI EasyUI创建菜单与按钮
2015/11/30 Javascript
玩转NODE.JS(四)-搭建简单的聊天室的代码
2016/11/11 Javascript
webuploader模态框ueditor显示问题解决方法
2016/12/27 Javascript
JavaScript常用正则验证函数实例小结【年龄,数字,Email,手机,URL,日期等】
2017/01/23 Javascript
JavaScript实现的简单加密解密操作示例
2018/06/01 Javascript
简单易扩展可控性强的Jquery转盘抽奖程序
2019/03/16 jQuery
小程序api实现promise封装过程解析
2019/11/21 Javascript
JS实现移动端双指缩放和旋转方法
2019/12/13 Javascript
javascript设计模式 ? 外观模式原理与用法实例分析
2020/04/15 Javascript
[03:47]2015国际邀请赛第三日现场精彩回顾
2015/08/08 DOTA
[03:16]DOTA2完美大师赛主赛事首日集锦
2017/11/23 DOTA
整理Python中的赋值运算符
2015/05/13 Python
Linux上安装Python的PIL和Pillow库处理图片的实例教程
2016/06/23 Python
Django教程笔记之中间件middleware详解
2018/08/01 Python
python爬取内容存入Excel实例
2019/02/20 Python
解析Python3中的Import
2019/10/13 Python
python实现高斯判别分析算法的例子
2019/12/09 Python
Python运行提示缺少模块问题解决方案
2020/04/02 Python
利用Python优雅的登录校园网
2020/10/21 Python
css3实现椭圆轨迹旋转的示例代码
2018/10/29 HTML / CSS
Fabletics官网:美国运动服饰品牌,由好莱坞女演员凯特·哈德森创立
2019/10/19 全球购物
爱尔兰橄榄球店:Irish Rugby Store
2019/12/05 全球购物
平面设计自荐信
2013/10/07 职场文书
办公室内勤工作职责
2013/12/11 职场文书
汽车运用工程专业求职信
2014/06/18 职场文书
Netty结合Protobuf进行编解码的方法
2021/06/26 Java/Android
云服务器部署 Web 项目的实现步骤
2022/06/28 Servers