关于继承与重写

<?php
header("content-type:text/html;charset='utf-8'");

/*
继承,它是指建立一个新的派生类,从一个或多个先前定义的类中继承数据和函数,
而且可以重新定义或加进新数据和函数,从而建立了类的层次或等级。说的简单点就是,
继承性是子类自动共享父类数据结构和方法的机制,

 在软件开发中,类的继承性使所建立的软件具有开放性、可扩充性,这是信息组织与分类的行之有效的方法,
 它简化了对象、类的创建工作量,增加了代码的可重性。采用继承性,提供了类的规范的等级结构。
 通过类的继承关系,使公共的特性能够共享,提高了软件的重用性。
 
 PHP是单继承,也就是说,一个类只能直接从一个类中继承数据,
*/

//定义一个“人类”作为父类
class Person
{
    
	public $name;
	public $age;
	public $sex;

	//构造方法 会在创建对象的时候自动调用,初始化赋值
	 function __construct($name,$age,$sex)
	{
		$this->name=$name;
		$this->age=$age;
		$this->sex=$sex;	
	}

    //这个人可以说话的方法, 说出自己的成员属性,
	function say()
	{
		echo $this->name."这个人在说话,他说他的年龄是".$this->age."性别是".$this->sex."</br>";
       
	}

  
}
/*
//定义一个子类“学生类“使用”extends”关键字来继承”人”类
class Student extends Person
{
    public $school;  //学生所在学校的属性
	

  
    //这个学生学习的方法
    function study() 
    {
        echo "我的名子叫:".$this->name." 我正在”.$this->school.” 学习<br>";

    }           

}

$s1 = new Student('小红','20','女');
echo $s1->say();
*/
/*
人类里面“说话”的方法里面说出的是“Person”类里面的属性, 而“Student”类对“Person”类进行了扩展,
又扩展出了几个新的属性,如果使用继承过来的“say()”说话方法的话,只能说出从“Person”类继承过来的那些属性,
那么新扩展的那些属性使用这个继承过来的“say()”的方法就说不出来了,那有的人就问了,我在“Student”这个子类中再定义
一个新的方法用于说话,说出子类里面所有的属性不就行了吗?一定不要这么做, 从抽象的角度来讲, 
一个“学生”不能有两种“说话”的方法,就算你定义了两个不同的说话的方法,可以实现你想要的功能,
被继承过来的那个“说话“方法可能没有机会用到了,而且是继承过来的你也删不掉。这个时候我们就要用到覆盖了。

虽然说在PHP里面不能定义同名的方法, 但是在父子关系的两个类中,我们可以在子类中定义和父类同名的方法,
这样就把父类中继承过来的方法覆盖掉了。

*/

class Student extends Person
{

    public $school;  //学生所在学校的属性

	//如果自己在类外再去定义属性访问的话,不用写
	public function __construct($name,$age,$sex,$school){
		//使用父类中的方法为原有的属性赋值
		parent::__construct($name,$age,$sex); //
		$this->school=$school;
	}
      
    //这个学生学习的方法
    public function study() 
	{

		echo "我的名子叫:".$this->name." 我正在”.$this->school.” 学习<br>";

	}


	//这个学性可以说话的方法, 说出自己所有的属性,覆盖了父类的同名方法
	public function say() 
	{

		//使用父类的“类名::“来调用父类中被覆盖的方法;
		// Person::say();

		//或者使用“parent::”的方试来调用父类中被覆盖的方法;
		parent::say();

		//加上一点自己的功能

		echo "我在".$this->school."上学.<br>";

	  }                                

}

/*
构造方法在子类中如果没有声明的话,也可以使用父类中的构造方法,如果子类中重新定义了一个构造方法也会
覆盖掉父类中的构造方法,如果想使用新的构造方法为所有属性赋值也可以用同样的方式。
*/

/*
子类访问自己的属性,需要再去在类外定义,然后去调用
$s1 = new Student('八蛋','15','男');
$s1->school='bawei';
$s1->say();
$s1->study(); //调用子类自己的方法
*/


//更直接的是在子类中重写构造方法,继承原有的父类方法,再加上自己的,
$s1 = new Student('八蛋','15','男','beida');
$s1->say();




你可能感兴趣的:(关于继承与重写)