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