示例介绍
- 用表格的方式展示学生成绩单
- 查询指定学生的单科成绩
- 删除指定学生的所有成绩
示例代码
<?php
//建立一个抽象类,类内包含成绩表数组,打印成绩表,和一个查询用的抽象方法
abstract class Score
{
protected $data = [
['姓名' => '张三', '语文' => '78', '数学' => '85'],
['姓名' => '李四', '语文' => '45', '数学' => '55'],
['姓名' => '王五', '语文' => '85', '数学' => '63'],
['姓名' => '任六', '语文' => '68', '数学' => '57'],
['姓名' => '王伟', '语文' => '88', '数学' => '89'],
['姓名' => '李刚', '语文' => '82', '数学' => '90'],
];
private function format($a, $b)
{
return $a .= ('<tr><th>' .
$b['姓名'] . '</th><th>' .
$b['语文'] . '</th><th>' .
$b['数学'] . '</th></tr>');
}
public function showData()
{
echo array_reduce(
$this->data,
[$this, 'format'],
'<table border="1" cellspacing="0"><tr><th>姓名</th><th>语文</th><th>数学</th></tr>'
) . '</table><hr>';
}
public abstract function search($name, $subject);
}
//创建一个包含所有查询方法的trait
trait scoreSearch
{
//查询单人的所有成绩,查询成功返回原数组内索引和对应的键值
protected function search_array($data, $name)
{
foreach ($data as $key => $value) {
if (!array_search($name, $value) === false) :
$result = [$key, $value];
break;
endif;
$result = '没有此人.<hr>';
}
return $result;
}
//查询出单科的成绩
protected function single_score($array, $subject, &$score)
{
if (!array_key_exists($subject, $array[1])) return false;
$score = $array[1][$subject];
if ($score === false) :
return false;
endif;
return true;
}
}
//查询学生的单科成绩
trait operation1
{
use scoreSearch;
protected function operation($data, $name, $subject = null)
{
$array = $this->search_array($data, $name);
if (is_string($array)) return $array;
if ($this->single_score($array, $subject, $score)) :
return $name . '的' . $subject . '成绩是' . $score . '分<hr>';
else :
return '查询的科目不存在<hr>';
endif;
}
}
//删除表格内单个学生的所有成绩
trait operation2
{
use scoreSearch;
//删除单个学生的所有成绩
private function operation(&$array, $name)
{
$result = $this->search_array($array, $name);
if (is_string($result)) return '删除失败,没有此人.<hr>';
$size1 = count($array);
unset($array[$result[0]]);
$size2 = count($array);
return $size1 > $size2 ? $name.'被成功删除!<hr>' : '删除失败<hr>';
}
}
//创建一个工作类继承Score类,用于查询和删除数据
class Export extends Score
{
//两个trait的方法名冲突,将operation2内的方法设置别名为del_value并将权限设置为public
use operation1, operation2 {
operation1::operation insteadof operation2;
operation2::operation as public del_value;
}
//查询学生的单科成绩
public function search($name, $subject)
{
return $this->operation($this->data, $name, $subject);
}
//删除指定学生所有成绩
public function del_array($name)
{
echo $this->del_value($this->data, $name);
}
}
//将工作对象实例化
$ex = new Export;
//显示成绩表
echo $ex->showData();
//查询学生成绩
echo $ex->search('李刚', '数学');
//查询学生名不存在时
echo $ex->search('jim', '数学');
//查询科目不存在时
echo $ex->search('李四', '地理');
//删除学生成绩
$ex->del_array('王五');
$ex->del_array('王伟');
//删除学生不存在时
$ex->del_array('李磊');
//显示成绩表
echo $ex->showData();
运行结果