10月9日作业
1. 写一个抽象类并继承它, 内容自定
<?php //抽象类 namespace _1009; class Person1 { protected $name; public function __construct($name = 'brother') { $this->name = $name; } public function getName() { return $this->name; } public function setName($value) { $this->name = $value; } } $person = new person1(); echo '我的姓名:',$person->getName(),'<br>'; $person->setName('万物'); echo '我的姓名:',$person->getName(),'<br>'; echo '<hr>'; //当类中有一个方法没有实现.而仅仅做了一个实现的约定 //那么当前这个类必须把他声明为抽象类 //只需要在类前声名 abstract abstract class Person2 { //抽象属性:属性没有值 protected $name; public function __construct($name = 'brother') { $this->name = $name; } public function getName() { return $this->name; } //签名:协议的接口 //抽象方法: 给了一个方法但是有很多不确定的因素. abstract public function setName($value); } //抽象方法的两个基本特征 //第一不允许实例化 //第二抽象类中所有的抽象方法必须在子类中实现 class Stu extends Person2 { //构造方法不会继承 public function __construct($name) { parent::__construct($name); } //抽象类中定义的抽象方法必须在子类中实现 public function setName($value) { $this->name = $value; } } $stu = new Stu('朱八戒'); echo '十万水军的大都督:'.$stu->getName().'<br>'; $stu->setName('悟空'); echo '花果山的美猴王是:'.$stu->getName().'<br>'; ?>
abstract: 定义抽象方法/抽象类
类中只要有一个抽象方法, 该类就应该声明为抽象类
抽象类只能被继承,不能实例化,并且抽象方法必须在子类实现
实现抽象方法的子类方法可见性不能低于抽象方法原定义
抽象方法是public, 子类方法只能是public
抽象方法是protected, 子类方法只能是protected/public
2. 模仿课堂案例,写一个接口实现CURD操作, 并扩展一到二个方法
<?php namespace _1009; interface iCurd { //增加数据 public function create($data); //读取数据 public function read(); // 更新数据 public function update($data, $where); //删除数据 public function delete($where); } //创建Db类,实现iCurd接口,完成基本的数据库操作 class Db implements iCurd { //数据库的链接对象 protected $pdo = null; // 数据表 protected $table; // 构造方法: 连接数据库,并设置默认的数据表名称 public function __construct($dsn, $user, $password, $table='staff') { $this->pdo = new \PDO($dsn, $user, $password); $this->table = $table; } //增加数据 public function create($data) { // 字段列表 $fields = ' (name, age, sex,position, mobile, hiredate) '; // 值列表 $values = ' (:name, :age, :sex, :position, :mobile, :hiredate) '; // 创建SQL $sql = 'INSERT INTO '.$this->table.$fields. ' VALUES ' . $values; $stmt = $this->pdo->prepare($sql); $stmt->execute($data); return [ 'count' => $stmt->rowCount(), 'id' => $this->pdo->lastInsertId() ]; } //$fields:字段 //$where:查询条件 //$limit:限制条数 // 查询数据 public function read($fields='*', $where='', $limit='0, 5') { //设置条件 $where = empty($where) ? '' : ' WHERE ' . $where; // 设置显示数量 $limit = ' LIMIT ' . $limit; $sql = 'SELECT ' . $fields . ' FROM ' . $this->table. $where . $limit; $stmt = $this->pdo->prepare($sql);//创建SQL语句对象 $stmt->execute();//执行SQL查询: return $stmt->fetchAll(\PDO::FETCH_ASSOC); } //更新数据 //array_keys():获取某一个数组所有的健 //trim删除一个字符串的前后空格 public function update($data, $where) { $keyArr = array_keys($data); $set = ''; foreach ($keyArr as $value) { $set .= $value . ' = :' . $value. ', '; } $set = rtrim($set, ', '); $sql = 'UPDATE ' . $this->table. ' SET ' . $set . ' WHERE ' . $where; $stmt = $this->pdo->prepare($sql); $stmt->execute($data); return $stmt->rowCount(); } // 删除数据 public function delete($where) { $sql = 'DELETE FROM ' .$this->table . ' WHERE ' .$where; $stmt = $this->pdo->prepare($sql); $stmt->execute(); return $stmt->rowCount(); } } // 客户端的代码 $dsn = 'mysql:host=127.0.0.1;dbname=php'; $user = 'root'; $password = '123456'; $db = new Db($dsn, $user, $password); // 遍历 foreach ($db->read() as $item) { print_r($item); echo '<br>'; } echo '<hr>'; // //新增 // $data = [ // 'name' => '黄蓉', // 'age' => 18, // 'sex' => 1, // 'position' => '打狗棍接班人', // 'mobile' => '1234567899', // 'hiredate' => time() // ]; // $res = $db->create($data); // echo '成功的新增了:'. $res['count'].' 条记录,新增的记录的主键ID是'.$res['id']; // echo '<hr>'; //更新 // $data = [ // 'age' => 40, // 'position' => '抗金英雄' // ]; // $where = 'staff_id = 11'; // echo '成功的更新了: ' . $db->update($data, $where) . ' 条记录'; // 删除 $where = 'staff_id = 22'; echo '成功的删除了: ' . $db->delete($where) . ' 条记录'; ?>
3.关于接口的理解如下案例
<?php namespace _1009; //接口 //注意:接口中的方法全部都是抽象方法 //由于接口中的方法默认全是抽象方法 abstract可以省略不写 //接口的方法一定是public interface tYpe { //设置电脑型号 public function setType($type); //设置电脑的用途 public function setPurpose($purpose); } //Alien 类实现了接口internest class Alien implements tYpe { public $type;//type电脑类型属性 public $purpose;// $purpose用途属性 //接口的方法1 public function setType($type) { $this->type =$type ; } //接口中的方法2 public function setPurpose($purpose) { $this->purpose = $purpose; } //类中可以有自己的方法 public function getInfo() { return $this->type.$this->purpose.'电脑<br>'; } } //客户端调用代码 // Car 类实例化 $Alien = new Alien(); $Alien->setType('外星人'); $Alien->setPurpose('lunix专用'); echo $Alien->getInfo(); echo '<hr>'; ?>