博主信息
Victor的博客
博文
35
粉絲
0
評論
0
訪問量
10722
積分:0
P豆:78

PHP-抽象類和接口--2019年10月9日

2019年10月16日 02:16:00閱讀數:458博客 / Victor的博客 / PHP

1. 寫一個抽象類并繼承它, 內容自定

2. 模仿課堂案例,寫一個接口實現CURD操作, 并擴展一到二個方法

在實例中:  

【1】接口iDbPlug中定義了數據庫的創建、CURD 共5個方法,實現中改為鏈式調用的方法;

【2】接口iDbParam中定義了數據庫連接參數;

【3】抽象類DbSql中 實現接口 iDbPlug的5個方法,自身定義了7個和SQL語句有關的方法,還有一個設置PDO運行屬性的抽象方法;

【4】類DBSet,繼承了抽象類DbSql,實現了接口iDbParam,在這個類里采用單例模式,實現數據庫的自動連接;

【5】類DB中觸發數據庫連接,通過__callStatic()實現SQL語句的拼接,鏈式調用并執行CURD;

實例中遺留問題不少,不過基本完成了所有方法,可以實現絕大多數的SQL語句拼接,和數據庫操作。

運行測試情況:

data1009.jpg

實例代碼

<?php
namespace _1009;

//定義一個數據庫增刪改查+創建的接口
interface iDbPlug {
	public function create($fields);
	public function insert($data);
	public function update($data);
	public function query();
	public function delete();
}
//定義一個包含數據庫連接參數的接口
interface iDbParam {
	const TYPE = 'mysql';
	const HOST = '127.0.0.1';
	const DBNAME = 'test';
	const USER_NAME = '*';
	const PASSWORD = '*';
}
//抽象類包含公共的方法、包括抽象的需要實現的方法,實現對應接口的方法
abstract class DbSql implements iDbPlug {
	protected $pdo = null;
	// protected static $pdo = null;
	protected $table;
	private $field = '*';
	private $where;
	private $limit;
	private $like;
	private $in;
	private $orderBy;

	//SQL 語句關鍵詞處理
	public function table($tableName) {
		$this->table = $tableName;
		return $this;
	}
	public function field($fields) {
		$this->field = empty($fields) ? '*' : $fields;
		return $this;
	}
	public function where($where) {
		$this->where = empty($where) ? $where : ' WHERE ' . $where;
		return $this;
	}
	public function like($like) {
		$this->like = empty($like) ? $like : ' LIKE ' . "'" . $like . "'";
		return $this;
	}
	public function limit($limit) {
		$this->limit = empty($limit) ? $limit : ' LIMIT ' . $limit;
		return $this;
	}
	public function in($in) {
		$this->in = empty($in) ? $in : ' IN (' . $in . ')';
		return $this;
	}
	public function orderBy($orderBy, $option = 'ASC') {
		$sort = in_array($option, ['DESC', 'ASC']) ? $option : 'ASC';
		$this->orderBy = empty($orderBy) ? $orderBy : ' ORDER BY ' . $orderBy . ' ' . $sort;
		return $this;
	}
	//----------------以下數據庫的增刪改查,創建方法---------------------------
	public function create($fields) {
		// TODO...創建新表
	}
	public function insert($data) {
		$fields = '';
		$value = '';
		foreach ($data as $key => $v) {
			$fields = $fields . ',' . $key;
			$value = $value . ',:' . $key;
		}
		$fields = '(' . ltrim($fields, ',') . ')';
		$value = '(' . ltrim($value, ',') . ')';
		$sql = 'INSERT INTO '
		. $this->table
			. ' '
			. $fields
			. ' VALUES '
			. $value;
		$stmt = $this->pdo->prepare($sql);
		$stmt->execute($data);

		return [
			'count' => $stmt->rowCount(),
			'id' => $this->pdo->lastInsertId(),
		];
	}
	public function update($data) {
		$keyArr = array_keys($data);
		$set = '';
		foreach ($keyArr as $value) {
			$set .= $value . '=:' . $value . ',';
		}
		$set = rtrim($set, ',');
		$sql = 'UPDATE '
		. $this->table
		. ' SET '
		. $set
		. $this->where;
		$stmt = $this->pdo->prepare($sql);
		$stmt->execute($data);
		return $stmt->rowCount();
	}
	public function query() {
		$sql = 'SELECT '
		. $this->field
		. ' FROM '
		. $this->table
		. $this->where
		. $this->like
		. $this->in
		. $this->orderBy
		. $this->limit;
		$stmt = $this->pdo->prepare($sql);
		$stmt->execute();
		return $stmt->fetchAll(\PDO::FETCH_ASSOC);
	}
	public function delete() {
		$sql = 'DELETE FROM '
		. $this->table
		. $this->where
		. $this->orderBy
		. $this->limit;
		$stmt = $this->pdo->prepare($sql);
		$stmt->execute();
		return $stmt->rowCount();
	}
	abstract public function setPDOattr($attr, $value);
}
class DBSet extends DbSql implements iDbParam {
        //TODO ---需要改造
	private static $type = iDbParam::TYPE;
	private static $host = iDbParam::HOST;
	private static $dbname = iDbParam::DBNAME;
	private static $userName = iDbParam::USER_NAME;
	private static $password = iDbParam::PASSWORD;
	private static $instance = null;
	protected static $pdo = null;
	private function __construct() {
		$dsn = self::$type . ':host=' . self::$host . ';dbname=' . self::$dbname;
		$user = self::$userName;
		$password = self::$password;
	}
	private function __clone() {

	}
	public static function getInstance() {
		if (is_null(self::$instance)) {
			self::$instance = new self();
			self::$pdo = new \PDO($dsn, $user, $password);
		}
		return self::$instance;
	}
	public function setPDOattr($attr, $value) {
		$this->pdo->setAttribute($attr, $value);
		//PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ
	}
}
class DB {
	protected static $query = null;
	public static function connection() {
		self::$query = DBSet::getInstance();
	}
	public static function __callStatic($name, $argus) {
		return call_user_func_array([self::$query, $name], $argus);
	}
}

DB::connection();
//查詢
// $staffs = DB::table('staff')
// 	->field('staff_id,name,position,mobile')
// 	->where('name = "令狐沖"')
// 	->query();
// foreach ($staffs as $value) {
// 	print_r($value);
// 	echo '<br>';
// }
///////////////////////////////////////////

//添加
$data = [
	'name' => 'xxx',
	'age' => 100,
	'sex' => 1,
	'position' => '老板',
	'mobile' => '12349876523',
	'hiredate' => time(),
];
$res = DB::table('staff')->insert($data);
echo '成功的新增了: ' . $res['count'] . ' 條記錄,新增的記錄的主鍵ID是: ' . $res['id'];
echo '<hr>';
//////////////////////////////////////////////////

// 更新

// $data = [
// 	'name' => '依琳',
// 	'age' => 20,
// 	'sex' => 0,
// 	'position' => '小尼姑',
// ];

// $where = 'staff_id = 17';
// $staffs = DB::table('staff')->where($where)->update($data);
// echo '成功的更新了: ' . $staffs . ' 條記錄';

//////////////////////////////////////////////////

//刪除
$where = 'name = "xxx"';
$staffs = DB::table('staff')->where($where)->delete();
echo '成功的刪除了: ' . $staffs . ' 條記錄';
echo '<hr>';

?>
運行實例 ?
點擊 "運行實例" 按鈕查看在線實例




批改狀態:合格

老師批語:你們的老板是***, 可見多招人恨....

全部評論

文明上網理性發言,請遵守新聞評論服務協議

條評論
暫無評論暫無評論!
  • 白小姐救世民彩图2019