PHP面向对象 – 类的继承 extends final

类的继承性,是指一个新的子类可以从父类中派生出来,并且自动拥有父类的所有方法和属性

继承类的应用

PHP只支持单继承,不允许多重继承。一个子类只能有一个父类,不允许一个类直接继承多个类,但一个类可以被多个类继承。

可以有多层继承,即一个类可以继承某一个类的子类,如类 B 继承了类 A,类C 又继承了类 B,那么类 C 也间接继承了类 A。

class A{ …… }

class B extends A{ …… }

使用类的继承性需要注意以下内容:

1.如果子类中没有构造方法,子类会自动调用父类的构造方法;

2.如果子类中有自己的构造方法,就执行子类自己的构造方法;

3.在子类中使用父类的方法,有两种方法 parent::方法()$this->方法() 。建议用第一种方法,会让代码结构更清晰。

4.如果子类中存在一个与父类同名的方法,那么使用 parent::方法() 调用父类的方法,使用 $this->方法() 调用子类自己的方法。(这个也被称为 子类重载父类方法)

5.父类的属性的引用方法是 $this->属性。属性是不能区分父类还是子类的。

以下是栗子:

//类的继承
class person{
	public $name;
	private $sex;
	protected $age;
	public function __construct($name,$sex,$age){
		$this->name = $name;
		$this->sex = $sex;
		$this->age = $age;
	}
	public function say(){
		echo '我是'.$this->name.',今年'.$this->age.'岁,性别是'.$this->sex.'<br>';		
	}
}

class stu extends person{
	public $grade;
	public function __construct($name,$sex,$age,$grade){	//重构构造方法
		parent::__construct($name,$sex,$age);	//调用父类的构造方法
		$this->grade = $grade;
	}
	public function student(){
		echo '我是一名'.$this->grade.'年级的学生,我叫'.$this->name.'今年'.$this->age.'岁,性别是'.$this->sex.'<br>';
	}
	public function say(){
		echo '这是子类的say()方法<br>';
	}
	public function action1(){
		parent::say();		//调用父类中的say()方法
	}
	public function action2(){
		$this->say();	//调用子类中的say()方法
	}
}

$s = new stu('小明','男',12,'五');
$s->student();	//输出结果是"我是一名五年级的学生,我叫小明今年12岁,性别是",无法输出性别,因为sex是私有属性
$s->say();	//输出结果是"这是子类的say()方法"
$s->action1();	//输出结果是"我是小明,今年12岁,性别是男"
$s->action2();	//输出结果是"这是子类的say()方法"

禁止类的继承 - final类 和 final方法

1.final类不能被继承:如果我们不想让一个类被继承,可以用 final 去修饰它

final class person{ ...... }

如下面的栗子:

//类继承的 final
final class person1{
	public $name;
	private $sex;
	protected $age;
	public function __construct($name,$sex,$age){
		$this->name = $name;
		$this->sex = $sex;
		$this->age = $age;
	}
	public function say(){
		echo '我是'.$this->name.',今年'.$this->age.'岁,性别是'.$this->sex.'<br>';		
	}
}
//class stu1 extends person1{}	//无法继承,会报错

2.final父类方法,子类不能重载(重写)此父类方法

public final say(){ ...... }

如下面的栗子:

//类方法的final
class person2{
	public $name;
	private $sex;
	protected $age;
	public function __construct($name,$sex,$age){
		$this->name = $name;
		$this->sex = $sex;
		$this->age = $age;
	}
	public final function say(){
		echo '我是'.$this->name.',今年'.$this->age.'岁,性别是'.$this->sex.'<br>';		
	}
}
class stu2 extends person2{
	/*
	父类的final方法无法重写,会报错
	public function say(){
		echo '子类重写say()方法';
	}
	*/
}
$s2 = new stu2('小丽','女',16);
$s2->say();

 

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇