Correcting teacher:天蓬老师
Correction status:qualified
Teacher's comments:代码不用截图, 图片应该是运行效果
抽象类
为什么要用抽象类,字面理解,就是只拿来当父类的类
,应该给它定义成抽象类,不允许实例
分离
,抽象类分离了设计
与实现
认为父类是设计类
,子类是工作类
。意有的时候父类分离了部分代码,有些还是依靠父类来完成
在父类中,尽可能的使用protected 属性.来完成封装.
注意:在父类[设计类]中这么去写虽然没有错,但是按照程序的设计来说,这么写就是不对的,我们应该在抽象类中只保留一些抽象方法,让子类[工作类]来完成父类的工作!而不是如上图那样,在设计类中把活儿都干完了!这么是不对滴!
接口
的概念:完全的分离了“设计与实现”;
interface 关键字,专门声明接口![单接口];
接口里面的方法都是abstract的,不需要加abstract关键字
接口里面所有成员的访问控制都是public
接口中不需要属性,但允许常量存在,定义在接口中的常量,一般统称为:接口常量,接口常量不允许被修改。
接口还可以有接口的构造方法;
既然接口定义好了,那我们就需要实现它的类;[工作类]
接口中 访问接口中常量的方式是以:接口名::常量名
接口与抽象类+mysql实战代码加深理解
<?php
#接口的应用场景3: 用抽象类实现接口;
interface iDbbase
{
//新增
public static function insert($db,$data);
//修改
public static function update($db,$optoins);
//查询
public static function select($db,$optoins=[]);
//删除
public static function delete($db,$where);
}
#实现类抽象类来充当
abstract class aDb implements iDbbase
{
#抽象类充当接口实现类时,不用必须实现接口中的方法;
#当实现类中的方法中有一些公共操作时,可以将这些操作放在中间的抽象类中实现`
#使用单例模式来连接 创建类的唯一实例;
protected static $db = null;
public static function connect($dsn,$username,$password)
{
if(is_null(self::$db)){
//如果当前连接对象是null,表示还没有连接数据库
self::$db=new PDO($dsn,$username,$password);
}
return self::$db;
}
}
class Db extends aDb
{
#插入:
public static function insert($db,$data){
if(!is_array($data)){
die('非法参数,请检查后在输');
}
foreach($data as $value){
$new[] =$value;
}
$sql = 'INSERT INTO `users` (`name`,`age`,`email`) VALUES(?,?,?)';
$stmt = $db->prepare($sql);
$stmt->execute($new);
}
//查询
public static function select( $db, $optoins=[] )
{
return $db->query("SELECT * FROM `users` LIMIT 2")->fetchALL(PDO::FETCH_ASSOC);
}
//修改
public static function update($db,$optoins){
foreach($optoins as $value){
$new[] =$value;
}
$sql= "UPDATE `users` set `name`=?,`age`=?,`email`=? where `id`=?";
$stmt = $db->prepare($sql);
$stmt->execute($new);
}
//删除
public static function delete($db,$where){
$sql = 'DELETE FROM `users` where `id`=?';
$stmt = $db->prepare($sql);
$stmt->execute([$where]);
}
}
$config = [
'type' => $type ?? 'mysql',
'host' => $host ?? 'localhost',
'dbname' => $table ?? 'phpedu',
'charset' => $charset ?? 'utf8',
'port' => $port ?? '3306',
'username' => $username ?? 'root',
'password' => $password ?? '123456'
];
$dsn =sprintf('%s:host=%s;dbname=%s;',$config['type'],$config['host'],$config['dbname']);
$username =$config['username'];
$password =$config['password'];
$db=Db::connect($dsn,$username,$password);
//insert操作
$data=[
'name'=>'李四',
'age' =>100,
'email' =>'163@.com'
];
Db::insert($db,$data);
//查询操作 不带条件的.
// foreach(Db::select($db) as $user){
// print_r($user);
// }
//修改
$optoins=[
'name'=>'四',
'age' =>200,
'email' =>'222@.com',
'id' =>4
];
Db::update($db,$optoins);
//删除
$where= 11;
Db::delete($db,$where);
在这里的话,需要引用的时候,就使用trait来将类打包成一个零件,,用use
关键字导入即可!