PHP类继承 extends使用介绍

2015-01-24信息快讯网

我们在文章中为大家详细介绍了有关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和javascript常用正则表达式及用法实例
PHP生成二维码的两个方法和实例
PHP中使用TCPDF生成PDF文档实例
PHP中使用CURL模拟登录并获取数据实例
2个比较经典的PHP加密解密函数分享
PHP使用GIFEncoder类处理gif图片实例
PHP使用GIFEncoder类生成gif动态滚动字幕
PHP使用GIFEncoder类生成的GIF动态图片验证码
ThinkPHP模板判断输出Present标签用法详解
编译PHP报错configure error Cannot find libmysqlclient under usr的解决方法
PHP内置过滤器FILTER使用实例
PHP错误Parse error: syntax error, unexpected end of file in test.php on line 12解决方法
destoon整合ucenter后注册页面不跳转的解决方法
destoon整合UCenter图文教程
destoon之URL Rewrite(伪静态)设置方法详解
解密ThinkPHP3.1.2版本之模板继承
windows下PHP_intl.dll正确配置方法(apache2.2+php5.3.5)
那些年我们错过的魔术方法(Magic Methods)
PHP mail()函数使用及配置方法
PHP 登录完成后如何跳转上一访问页面
PHP四舍五入精确小数位及取整
php的一个简单加密解密代码
PHP随机生成随机个数的字母组合示例
php中filter函数验证、过滤用户输入的数据
codeigniter框架批量插入数据
百度站点地图(百度sitemap)生成方法分享
php Calender(日历)代码分享
codeigniter使用技巧批量插入数据实例方法分享
zend framework文件上传功能实例代码
php使用filter过滤器验证邮箱 ipv6地址 url验证
php calender(日历)二个版本代码示例(解决2038问题)
解决file_get_contents无法请求https连接的方法
Server.HTMLEncode让代码在页面里显示为源代码
php类中private属性继承问题分析
PHP面向对象三大特点学习(充分理解抽象、封装、继承、多态)
©2014-2024 dbsqp.com