php企业网站做了那么久了,项目经验倒是积累了不少,但是当问及底层的东西时候,常常是百度个半天。现在项目设计底层的东西越来越少,可以说是真正用到的也就是那么一点,真正核心的东西都已经被框架封装好了,例如殷雯企业网站管理系统,调用个数据就一行代码的事情$N->getNewsTitle()就能取得新闻标题,不用写sql语句,不用指定id全自动处理。现在总感觉自己一直进步很慢,关于class设计思想,常常也是模糊印象。随着时间的流逝,我们常常会感慨书到用时方恨少了,接下来一定要恶补设计思想了。
今天先来复习一下类继承。
类继承很重要,作为程序员也基本每天都会和他打交道,但是有些东西你真的都知道吗?下面是从官网上面看到的。
一个类可以在声明中用 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()
*/
?>
当在类定义之外引用到这些项目时,要使用类名。