Correcting teacher:天蓬老师
Correction status:qualified
Teacher's comments:作业并没有按要求来, 希望下次注意, 继续努力
PHP中的闭包,就是匿名函数,没有其他的区分
例
<?php
$a = function (){
return '这里是匿名函数';
};
// 以函数方式调用,需要加括号
echo $a();
如果类里面有invoke()
方法,也可以把类实例对象当作闭包函数来调用,输出内容为此方法里面的内容
例
<?php
class Demo
{
public function __invoke()
{
return '这是类里面的invoke方法';
}
}
$obj= new Demo;
echo $obj();
如果类里面有toString()
方法,也可以把类实例对象当作字符串直接输出,输出内容为此方法里面的内容
例
<?php
class Demo
{
public function __toString()
{
return '这是类里面的toString方法';
}
}
$obj= new Demo;
echo $obj;
如果类里面有callStatic()
方法,访问类中一个不存在的静态方法时,会自动触发这个方法
例
<?php
class Demo
{
public static function __callStatic($name, $arguments)
{
echo '这是类里面的callstatic方法';
}
}
//输出的是callstatic方法里面的内容
Demo::fetch();
bindTo()方法,把一个闭包绑定给闭包对象或者绑定在一个类的内部
格式
将要绑定的闭包->bindTo(闭包对象,类)//两个被绑定的参数只用一个也行
例
<?php
namespace chapter;
// 使用闭包访问类中的成员,(通过访问类中的方法,其返回值,来访问到类成员)
class Demo1
{
public $name='杨过';
public $school='古墓派';
//如果以函数操作输出闭包对象,就会调用此方法,把闭包对象当作函数输出
public function __invoke()
{
return $this->name. ':' .$this->school;
}
}
// 创建一个闭包对象
$demo1 = new Demo1;
// 直接输出闭包对象
echo $demo1();
// 创建一个闭包,用来修改类中的属性
$set = function (string $name,string $school) : void
{
$this->name = $name;
$this->school = $school;
};
// 把修改用闭包绑定给demo1的闭包对象,并赋值给新的变量
$res = $set->bindTo($demo1);
// 修改demo1里面的属性
$res('周芷若', '峨眉派');
echo $demo1();
登录验证
<?php
namespace chapter;
// 引入异常类
use Exception;
//引入PDO
use PDO;
//创建一个自定义异常类继承系统自带异常类
class MyException extends Exception
{
public function __toString() : string
{
return
'<table border="1" cellspacing="0" cellpadding="3">
<tr>
<td>错误信息</td>
<td>错误代码</td>
<td>操作</td>
</tr>
<tr>
<td>'.$this->message.'</td>
<td>'.$this->code.'</td>
<td><a href="demo.html">返回</a></td>
</tr>
</table>';
}
}
// 创建数据源
$dsn = "mysql:host=localhost;dbname=phpedu";
$name = 'root';
$word = 'root';
//创建pdo对象
$pdo = new PDO($dsn,$name,$word);
// SQL语句
$sql = "SELECT * FROM `user`";
$stmt=$pdo->prepare($sql);
$stmt->execute();
//获取数据库里面的用户信息
$users = $stmt->fetchAll(PDO::FETCH_ASSOC);
//获取跳转链接信息
$action = filter_input(INPUT_GET,'action');
if($action === 'login'){
//判断信息获取方式
if(filter_input(INPUT_SERVER,'REQUEST_METHOD')==='POST'){
//获取用户名
$username = filter_var(filter_input(INPUT_POST,'username'),FILTER_SANITIZE_STRING);
//获取密码
$password = sha1(filter_input(INPUT_POST,'password'));
//判断登录用户是否存在于数据库中
$result = array_filter($users, function ($value) use ($username, $password) {
return $username === $value['name'] && $password === $value['password'];
});
//异常判断
try{
//异常判断,创建自定义异常类并传入参数
if(count($result)!==1)throw new MyException('用户名或者密码错误',101);
}catch (MyException $e){
echo $e;
};
}
}