PHP类继承 extends使用介绍
发布:smiling 来源: PHP粉丝网 添加日期:2020-08-26 21:01:10 浏览: 评论:0
出来工作这么久了,项目经验倒是不少,但是当问及底层的东西时候,常常是一言不发了。现在项目设计底层的东西越来越少,可以说是真正用到的也就是那么一点,真正核心的东西都已经被框架封装好了。总感觉自己一直进步很慢,关于底层设计思想,常常也只可意会。随着时间的流逝,我们常常会感慨书到用时方恨少了,接下来一定要恶补设计思想了。
今天先来复习一下类继承。
类继承很重要,作为程序员也基本每天都会和他打交道,但是有些东西你真的都知道吗?下面是从官网上面看到的。
一个类可以在声明中用 extends,关键字继承另一个类的方法和属性。PHP不支持多重继承,一个类只能继承一个基类。
被继承的方法和属性可以通过用同样的名字重新声明被覆盖。但是如果父类定义方法时使用了 final,则该方法不可被覆盖。可以通过 parent:: 来访问被覆盖的方法或属性。
当覆盖方法时,参数必须保持一致否则 PHP 将发出 E_STRICT 级别的错误信息。但构造函数例外,构造函数可在被覆盖时使用不同的参数。
关于基本的概念想必大家都会知道,但是对于final和parent::在项目中我还真没有怎么使用过,惭愧啊。
下面主要说一下这两个关键字的用途吧。
Final 关键字
PHP 5新增的一个关键字,如果父类中的方法被声明为 final,则子类无法覆盖该方法。同样如果一个类被声明为 final,则不能被继承。
需要注意的是: 属性不能被定义为 final,只有类和方法才能被定义为 final。
范围解析操作符(::)
当一个子类覆盖其父类中的方法时,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()!
- //phpfensi.com
- /**
- * 输出结果 ->
- * 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类继承的全部实现步骤。
Tags: PHP类继承 extends
相关文章
- ·PHP 面向对象 继承(2013-11-14)
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)