批改状态:合格
老师批语:面向对象最重要的特征之一, 就是实现对成员访问的控制 , 即封装
1,类的继承
// 引用父类方法内容 parent :: 要加()内的部分要写全, 没有参数要加空括号 (),变量不可以引用
// 类的继承要主要类成员的访问权限, 私有成员不可以继承
// 类的继承为类的复制,类的方法扩展,类的方法重写
// 类的方法扩展,是在父类的基础上增加新的属性及方法
// 类的方法重写,是指在父类的基础上进行新的方法设定,
// 因为子类的名称与父类不同,方法扩展和重写,都相当于是一个新的方法,但可以减少父类部分的代码书写量。
// __construct中的参数要写在 new 对象中 而不是对象调用的方法中
class Postion{
// 属性
public $pos;
public $comname;
public $contry;
// 此处接受外面的传值,向属性赋值
function __construct($pos,$comname,$contry)
{
// 指定传值对应的属性
$this->pos=$pos;
$this->comname=$comname;
$this->contry=$contry;
}
function getinfo()
{
return '职位名称:'.$this->pos.'<br>'.'公司名称:'.$this->comname.'<br>'.'国家地区:'.$this->contry;
}
}
// new 一个对象,并传值
$po = new Postion('php工程师','php中文网','中国大陆');
// 输出指定对象的一个指定方法
echo $po->getinfo();
echo '<hr>';
// 继承Postion的内容及扩展年假标准
class Cnpos extends Postion
{
public $salary;
public $cont;
// __construct参数要写全
function __construct($pos,$comname,$contry,$salary,$cont)
{
// 引用父类—__construct的内容 __construct参数要写全 parent内容要加()内的部分 变量不可以引用
parent::__construct($pos,$comname,$contry);
$this->salary=$salary;
$this->cont=$cont;
}
function getinfo1(){
// 返回父类getinfo的内容 有两种方式,
// 方式一 this指定父类内容
return $this->getinfo().'<br>'.'薪水标准:'.$this->salary.'元'.'<br>'.'合同年限:'.$this->cont.'年';
// 方式二 返回父类的引用
return parent::getinfo().'<br>'.'薪水标准:'.$this->salary.'元'.'<br>'.'合同年限:'.$this->cont.'年';
}
}
$po1 = new Cnpos('php工程师','php中文网','中国大陆',10000,3);
echo $po1->getinfo1();
echo '<hr>';
//
// 年假计算 aleaves方法重载
class Aleave extends Cnpos
{
// 方法内容要返回出去才有效
function annual(){
return 7;
}
//非数值返回,无法进行赋值计算,如需要计算要分别返回
function aleaves()
{
return $this->getinfo1().'<br>'.'年假天数:'.$this->annual().'天/年';
}
}
$po2 = new Aleave('php工程师','php中文网','中国大陆',20000,3);
echo $po2->aleaves();
echo '<hr>';
class AleaveNew extends Aleave
{
function aleaves()
{
// 把父类内的方法赋值注意要加()
$aleavetatol = parent::annual();
switch(true)
{
case ($this->cont >2 && $this->cont <3):
$aleavetatol += 2;
break;
case ($this->cont >=3 && $this->cont <5):
$aleavetatol += 4;
break;
case ($this->cont >=5):
$aleavetatol += 7;
break;
default:
}
return $this->getinfo1().'<br>'.'年假天数:'.$aleavetatol.'天/年'.',合同年限每多两年,年假多增加两天';
}
}
$po3 = new AleaveNew('php工程师','php中文网','中国大陆',20000,3);
echo $po3->aleaves();
echo '<hr>';点击 "运行实例" 按钮查看在线实例
2,类的访问权限
// 理解:类中内容的调用权限管理 // 类内容的访问限制
// 类的访问限制是指类内容的对外开放的权限,可以指定类成员的调用源,以提高代码的隐私性。
// 类的属性和方法前加限定符:
// protected 是指子类可以调用
// private ***类自己调用
// public 是指可以从外部单独调用
// 用户权限访问器是由方法控制而不是由类成员访问权限控制,超出访问权限访问会报错,而不是访问返回空,需要区别理解
class Postion1{
// 属性
public $pos;
protected $comname;
public $contry;
private $level;
// 此处接受外面的传值,向属性赋值
function __construct($pos,$comname,$contry,$level)
{
// 指定传值对应的属性
$this->pos=$pos;
$this->comname=$comname;
$this->contry=$contry;
$this->level=$level;
}
function getinfo()
{
return '职位名称:'.$this->pos.'<br>'.'公司名称:'.$this->comname.'<br>'.'国家地区:'.$this->contry.'<br>'.'职位等级:'.$this->level;
}
}
class Postion2 extends Postion1
{
function getinfo()
{
return '职位名称:'.$this->pos.'<br>'.'公司名称:'.$this->comname.'<br>'.'国家地区:'.$this->contry.'<br>'. '职位等级:'.$this->level;
}
}
$postion = new Postion1('前端开发讲师','php中文网','中国大陆','p3');
$postion2 = new Postion2('前端开发讲师','php中文网','中国大陆','p3');
// $level是private 私有项 ,类内部的方法可以调用,外部不可以直接调用。子类中也不可以调用
// echo $postion->level;
echo '<hr>';
// $comname是protected 保护项 ,类内部的方法可以调用,外部不可以直接调用。也可以通过子类的方法调用
echo $postion->getinfo();
echo '<hr>';
// 此项输出会报错
echo $postion->comname;
echo '<hr>';
// 此项输出会报错,去掉postion2中getinfo中的this->level 后正常
echo $postion2->getinfo();点击 "运行实例" 按钮查看在线实例
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号