isset和unset的使用
__isset:判断属性是否存在或者为空会自动触发
__isset()是测定变量是否设定用的函数,传入一个变量作为参数,如果传入的变量存在则传回true,否则传回false。
如果对象里面成员是公有的,我们就可以使用这个函数来测定成员属性,如果是私有的成员属性,这个函数就不起作用了,原因就是因为私有的被封装了,在外部不可见。那么我们就不可以在对象的外部使用isset()函数来测定私有成员属性是否被设定了呢?当然是可以的,但不是一成不变。
你只要在类里面加上一个isset()方法就可以了,当在类外部使用isset()函数来测定对象里面的私有成员是否被设定时,就会自动调用类里面的isset()方法了帮我们完成这样的操作。
__unset:当对不可访问属性调用unset()时被调用
unset()这个函数的作用是删除指定的变量且传回true,参数为要删除的变量。
1、 如果一个对象里面的成员属性是公有的,就可以使用这个函数在对象外面删除对象的公有属性。
2、 如果对象的成员属性是私有的,我使用这个函数就没有权限去删除。
虽然有以上两种情况,但我想说的是同样如果你在一个对象里面加上unset()这个方法,就可以在对象的外部去删除对象的私有成员属性了。
在对象里面加上了unset()这个方法之后,在对象外部使用“unset()”函数删除对象内部的私有成员属性时,对象会自动调用unset()函数来帮我们删除对象内部的私有成员属性。
示例:
class people
{
public $username;
private $age;
public function __construct($username,$age)
{
$this->username = $username;
$this->age = $age;
}
//外部判断私有属性是否存在使用__isset自动执行
//public公用属性不通过__isset来执行
public function __isset($value)
{
//外部调用isset,公用属性public返回false不被执行
//私有属性private 返回true,可以对私有属性进行操作
echo isset($this->$value);
}
//外部使用__unset用来删除指定的变量。
//私有属性自动触发__unset进行操作
public function __unset($value)
{
echo isset($this->$value);
}
}
$people = new people('曹操',39);
var_dump(isset($people->$username));
echo "<hr>";
var_dump(isset($people->age));
echo "<hr>";
unset($people->$username);
echo "<hr>";
unset($people->age);
示例图:
总结:对isset的使用中可以直接处理掉公用属性,可以对私有属性赋值或者删除。同样unset也可以进行相同操作
构造器中对数据库增删改查
示例:
<?php
//方法委托实战:数据库查询构造器(链式查询)
class Query
{
// 连接对象
protected $db;
// 数据表
protected $table;
// 字段列表
protected $field;
// 记录数量
protected $limit;
//对数据赋值处理
public $updates;
// 构造方法: 连接数据库
public function __construct($dsn, $username, $password)
{
$this->connect($dsn,$username,$password);
}
//连接数据库
private 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 limit($limit)
{
$this->limit = $limit;
return $this;
}
//设置条件
public function condition($condition)
{
$this->condition = $condition;
return $this;
}
//设置内容
public function content($content)
{
$this->content = $content;
return $this;
}
//对数据库的增和改对数据表和值进行赋值处理
private function updates()
{
$field = $this->field;
$content = $this->content;
$values = array_combine($field,$content);
foreach ($values as $key =>$value)
{
$upd[] = "{$key}='{$value}'";
}
return join(",",$upd);
}
public function getSql($value)
{
switch ($value)
{
case 'select':
return sprintf('SELECT %s FROM %s LIMIT %s', $this->field, $this->table, $this->limit);
break;
case 'update':
$this->updates = $this->updates(); //将数据赋值处理
return sprintf('UPDATE %s SET %s WHERE %s',$this->table, $this->updates, $this->condition);
break;
case 'insert':
$this->updates = $this->updates(); //将数据赋值处理
return sprintf('INSERT %s SET %s', $this->table,$this->updates);
break;
case 'delete':
return sprintf('DELETE FROM %s WHERE %s',$this->table,$this->condition);
break;
default :
return '没有查询到的数据!';
}
}
// 执行查询
public function select()
{
return $this->db->query($this->getSql('select'))->fetchAll(PDO::FETCH_ASSOC);
}
// 执行更新
public function update()
{
return $this->db->query($this->getSql('update'));
}
// 执行增加
public function insert()
{
return $this->db->query($this->getSql('insert'));
}
//执行删除
public function delete()
{
return $this->db->query($this->getSql('delete'));
}
}
class DB
{
public static function __callStatic($name, $args)
{
//获取查询类的对象: new Query()
$dsn = 'mysql:host=localhost;dbname=mysqli';
$username = 'root';
$password = '142536';
$query = new Query($dsn,$username,$password);
return call_user_func([$query,$name],...$args);
}
}
$result = DB::table('user')
->field(['username','password','sex','age','email','mobile'])
->content(['天蓬',sha1('142536'),'男','38','tp@126.com','16612344321'])
->insert();
//使用数组赋值
echo $result ? '添加成功' :'添加失败';
echo "<hr>";
$result =DB::table('user')
->field('username')
->limit(10)
->select();
print_r($result); //输出查询
echo "<hr>";
$result = DB::table('user')
->field(['username','password','sex','age','email','mobile'])
->content(['啸天',sha1('142536'),'男','29','xtq@qq.com','1555551234'])
->condition("username = '嫦娥'")
->update();
//使用数组赋值
echo $result ? '更新成功' :'更新失败';
echo "<hr>";
$result = DB::table('user')
->condition('Id > 335')
->delete();
print_r($result);
echo $result ? '删除成功' :'删除失败';
示例图:
总结:案例中使用了array_combine对数据进行赋值后传入SQL执行。改写了输入字符串为数组。对类的构造方法又进一步学习。重点在return $this、对多个方法串联到一起。