实现isset()和unset()访问拦截操作
//重载:属性访问拦截器
// __isset(), __unset()对不可访问的属性进行调用
// isset() 函数用于检测变量是否已设置并且非 NULL
// unset()删除指定的变量且传回true,参数为要删除的变量
class User{
public $name;
private $age;
public function __construct($name,$age){
$this->name=$name;
$this->age=$age;
}
// 在外部对一个不可访问的属性使用isset()函数时,调用__isset()方法,在类内部检测成员是否存在
public function __isset($value){
return isset($this->$value);
}
// __unset()对一个不可访问的属性进行调用unset()时自动调用
public function __unset($value){
unset($this->$value);
}
}
$user=new User('张三','21');
// $name为公开成员可以直接使用isset函数
var_dump(isset($user->name));
echo '<br>';
var_dump(isset($user->age));
echo '<hr>';
print_r($user);//打印$user对象
echo '<br>';
//类中的公开属性成员可以直接被删除
unset($user->name);
print_r($user);
echo '<br>';
// unset()删除非公开成员,调用类中的__unset方法
unset($user->age);
print_r($user);
事件委托:insert(), update(), delete()方法
//查询类
class Query{
protected $db; // 连接对象
protected $table; // 数据表
protected $field; // 字段列表
protected $where; // 条件
protected $limit; // 记录数量
// 构造方法:连接数据库
public function __construct($dsn,$username,$password){
$this->connect($dsn,$username,$password);
}
// 数据库连接
public function connect($dsn,$username,$password){
$this->db=new PDO($dsn,$username,$password);
}
// 设置数据表表名
public function table($table){
$this->table=$table;
return $this; // 返回当前类的实例,方便链式调用后面的方法,必须加上
}
// 设置字段列表
public function field($field){
$this->field=$field;
return $this;
}
// 设置条件
public function where($id='id',$key=0,$b='='){
$this->where=$id.$b.'\''.$key.'\'';;
return $this;
}
// 设置返回的记录数量
public function limit($limit){
$this->limit=$limit;
return $this;
}
// 生成sql语句
public function getSql($value,$m='',$n=''){
switch($value){
case 'select'://查询:SELECT 字段列表 FROM 表名 WHERE 条件 LIMIT 数量;
$sql=sprintf('SELECT %s FROM %s LIMIT %d',$this->field,$this->table,$this->limit);
break;
case 'insert'://插入:INSERT 表名 SET 字段列表;INSERT INTO 表名 (字段列表) VALUES (字段列表对应的值)
// $sql=sprintf('INSERT %s SET %s',$this->table,$this->field);
$sql=sprintf('INSERT INTO %s (%s) VALUES (%s)',$this->table,$m,$n);
break;
case 'update'://更新:UPDATE 表名 SET 字段列表 WHERE 条件;
$sql=sprintf('UPDATE %s SET %s WHERE %s',$this->table,$m,$this->where);
break;
case 'delete'://删除:DELETE FROM 表名 WHERE 条件;
$sql=sprintf('DELETE FROM %s WHERE %s',$this->table,$this->where);
break;
}
return $sql;
}
// 执行查询操作
public function select(){
return $this->db->query($this->getSql('select'))->fetchAll(PDO::FETCH_ASSOC);
}
// 执行插入操作
public function insert($inserts=[]){
// 将数组中的键值调取出作为SQL的字段列表名
$m1='`'.implode('`,`',array_keys($inserts)).'`';
// 将数组中的值作为SQL中的字段列表名对应的值
$n1='\''. implode('\',\'',$inserts) . '\'';
return $this->db->exec($this->getSql('insert',$m1,$n1));
}
// 执行更新操作
public function update($args=[]){
$string='';
foreach($args as $key=>$v){
// 将需要更新的数组中的数据拼接成字符串
$string.= $key.'=\''.$v.'\',';
}
// echo $string;
return $this->db->exec($this->getSql('update',rtrim($string,',')));// rtrim()移除字符串右侧的空白字符或其他预定义字符
}
// 执行删除操作
public function delete(){
return $this->db->query($this->getSql('delete'));
}
}
// 数据库操作
class DB{
// 静态方法拦截
public static function __callStatic($name,$args){
$dsn = 'mysql:host=localhost;dbname=phpedu';
$username='root';
$password='root';
$query = new Query($dsn, $username, $password);
return call_user_func_array([$query,$name],$args);
}
}
// 数据输出:查询操作
$users=DB::table('user')->field('id,name,email')->limit(5)->select();
foreach ($users as $user) {
printf('<li>%s</li>',implode(',', $user));
}
echo '<hr>';
// 数据输出:插入操作
$user=DB::table('user')->insert(['name'=>'依依','email'=>'12345@qq.com','password'=>sha1('229988')]);
echo $user ?'插入成功':'插入失败';
echo '<hr>';
// 数据输出:更新操作
$user=DB::table('user')->where('id','14')->update(['name'=>'张龙4','email'=>'zhanglong4@qq.com','password'=>sha1('2249988')]);
print_r($user);
echo '<hr>';
// 数据输出:删除操作
$user=DB::table('user')->where('id','15')->delete();
print_r($user);
echo $user ?'删除成功':'删除失败';
echo '<hr>';
sleep()与wakeup()
// 序列化__sleep(), 反序列化__wakeup()
class Connection{
private $params=[]; // 连接参数
private $link=null; // 连接对象
// 构造方法 初始化操作
public function __construct($dsn,$username,$password){
$this->params['dsn']=$dsn;
$this->params['username']=$username;
$this->params['password']=$password;
$this->connect();
}
// 连接方法
public function connect(){
// 实例化
$this->link=new PDO(...array_values($this->params));// array_values() 函数返回包含数组中所有的值的数组
}
// 对象被序列化时进行调用,获取连接参数,返回的是一个数组
public function __sleep(){
return ['params'];
}
// 对象被反序列化时,要求自动连接数据库
public function __wakeup(){
$this->connect();
}
// 查询操作
public function select($sql){
return $this->link->query($sql)->fetchAll(PDO::FETCH_ASSOC);
}
}
// 将参数进行赋值并实例化
$dsn = 'mysql:host=localhost;dbname=phpedu';
$username='root';
$password='root';
$db = new Connection($dsn, $username, $password);
// 序列化后是一个字符串
$str = serialize($db);
echo $str .'<hr>';
// 反序列化后是一个对象
$link=unserialize($str);
print_r($db->select('select * from user limit 5'));