PHP类继承 extends使用介绍

 更新时间:2014年01月14日 17:59:41   作者:  
我们在文章中为大家详细介绍了有关PHP类继承 extends的实现方法,希望对于新手来说能够提升他们在PHP语言编程中的能力

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

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

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

一个类可以在声明中用 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实现文章置顶功能的方法

    这篇文章主要介绍了php实现文章置顶功能的方法,结合实例形式分析了php置顶功能的操作步骤与相关实现技巧,需要的朋友可以参考下
    2016-10-10
  • 优化PHP代码的53条建议

    优化PHP代码的53条建议

    优化PHP代码的50条建议,学习php的朋友可以看下,有助于提高php效率
    2008-03-03
  • Yii 2.0如何使用页面缓存方法示例

    Yii 2.0如何使用页面缓存方法示例

    页面缓存指的是在服务器端缓存整个页面的内容。随后当同一个页面 被请求时,内容将从缓存中取出,而不是重新生成。下面这篇文章主要给大家介绍了关于Yii2.0如何使用页面缓存的相关资料,需要的朋友可以参考下。
    2017-05-05
  • php中将数组转成字符串并保存到数据库中的函数代码

    php中将数组转成字符串并保存到数据库中的函数代码

    为了方便可以把php的数组转换为 字符串保存到数据库中。当需要用时就可以取出字符串再转成数组即可。下为为php数组与字符串相互转换的自定义函数
    2013-09-09
  • PHP实现文件上传和下载的示例代码

    PHP实现文件上传和下载的示例代码

    这篇文章主要为大家详细介绍了PHP如何实现文件上传与下载功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • PHP通过插入mysql数据来实现多机互锁实例

    PHP通过插入mysql数据来实现多机互锁实例

    这篇文章主要介绍了PHP通过插入mysql数据来实现多机互锁的方法,包括了加锁与释放锁的完整实现方法,非常实用,需要的朋友可以参考下
    2014-11-11
  • 深入解析PHP的引用计数机制

    深入解析PHP的引用计数机制

    本篇文章是对PHP中的引用计数机制进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • Discuz开启Gzip压缩多种方法汇总

    Discuz开启Gzip压缩多种方法汇总

    GZip可对多种类型的文件进行压缩,对于CSS、JS、HTML文件具有极高的压缩率,尤其对使用了较多JS特效的网站,开启GZip后压缩比高达70%。
    2023-05-05
  • php通过文件头判断格式的方法

    php通过文件头判断格式的方法

    这篇文章主要介绍了php通过文件头判断格式的方法,涉及php文件读取及字符串解析的相关技巧,需要的朋友可以参考下
    2016-05-05
  • PHP实现二维数组按指定的键名排序的方法示例

    PHP实现二维数组按指定的键名排序的方法示例

    这篇文章主要介绍了PHP实现二维数组按指定的键名排序的方法,这里以数组记录三个人信息中的年龄age字段值进行排序为例,分析了php二维数组排序的操作技巧,需要的朋友可以参考下
    2017-08-08

最新评论