【编程思路】
属性通过闭包更新,将闭包通过bind或bindTo绑定到类或对象,直接打印变量访问;
自定义一个异常类,获取到前端登录表单提交的数据,用异常类验证。
【作业总结】
这次作业主要是学会了bind和bindTo两种方法,闭包的好处以后慢慢体会吧;
这个登录验证感觉做的不好,给用户看这些报错是不是不好,这个感觉更多是给程序员看的。
【闭包代码演示】
实例<?php namespace day14\bindTo; // bindTo方法:将闭包绑定到类/对象 // 1、将闭包绑定到类,访问静态成员 // 创建Pc类 class Pc { public static $name = 'Macbook'; public static $price = '9999'; // 魔术方法 public static function __callStatic($name, $price) { return static::$name . ':' . static::$price; } } // 创建闭包,用来更新Pc的属性 $book = function ($name, $price) { static::$name = $name; static::$price = $price; }; // 将闭包绑定到类 $closure = $book->bindTo(null, Pc::class); $closure('Matebook', 8888); // 访问 echo Pc::display(); echo '<hr>'; // 2、将闭包绑定到对象 // 创建Pc1类 class Pc1 { public $name = 'Macbook'; public $price = '9999'; // 魔术方法 public function __toString() { return $this->name . ':' . $this->price; } } // 创建闭包,用来更新Pc1的属性 $book = function ($name, $price) { $this->name = $name; $this->price = $price; }; $pc1 = new Pc1; // 将闭包绑定到对象 $closure = $book->bindTo($pc1); $closure('Mibook', '5999'); echo $pc1; echo '<hr>'; // 3、将闭包绑定到对象和类上 // 创建Pc2类 class Pc2 { public $name = 'Macbook'; public static $price = '9999'; // 魔术方法 public function __toString() { return $this->name . ':' . static::$price; } } // 创建闭包,用来更新Pc2的属性 $book = function ($name, $price) { $this->name = $name; static::$price = $price; }; $pc2 = new Pc2; // 将闭包绑定到对象 $closure = $book->bindTo($pc2, Pc2::class); $closure('Mybook', '1999'); echo $pc2; echo '<hr>';运行实例 »
点击 "运行实例" 按钮查看在线实例
实例<?php namespace day14\bind; // bind方法:将闭包绑定到类/对象 // 1、将闭包绑定到类,访问静态成员 // 创建Pc类 class Pc { public static $name = 'Macbook'; public static $price = '9999'; // 魔术方法 public static function __callStatic($name, $price) { return static::$name . ':' . static::$price; } } // 创建闭包,用来更新Pc的属性 $book = function ($name, $price) { static::$name = $name; static::$price = $price; }; // 将闭包绑定到类 $closure = \Closure::bind($book, null, Pc::class); $closure('Matebook', '¥8888'); // 访问 $pc = new Pc; echo Pc::display(); echo '<hr>'; // 2、将闭包绑定到对象 // 创建Pc1类 class Pc1 { public $name = 'Macbook'; public $price = '9999'; // 魔术方法 public function __toString() { return $this->name . ':' . $this->price; } } // 创建闭包,用来更新Pc1的属性 $book = function ($name, $price) { $this->name = $name; $this->price = $price; }; $pc1 = new Pc1; // 将闭包绑定到对象 $closure = \Closure::bind($book, $pc1); $closure('Mibook', '¥5999'); echo $pc1; echo '<hr>'; // 3、将闭包绑定到对象和类上 // 创建Pc2类 class Pc2 { public $name = 'Macbook'; public static $price = '9999'; // 魔术方法 public function __toString() { return $this->name . ':' . static::$price; } } // 创建闭包,用来更新Pc2的属性 $book = function ($name, $price) { $this->name = $name; static::$price = $price; }; $pc2 = new Pc2; // 将闭包绑定到对象 $closure = \Closure::bind($book, $pc2, Pc2::class); $closure('Mybook', '¥1999'); echo $pc2; echo '<hr>';运行实例 »
点击 "运行实例" 按钮查看在线实例
【自定义异常类】
实例<?php namespace day14\login; use Exception; // 登录验证 //try { // // 正在执行的代码 // if (true) throw new Exception('验证失败', 101); //} catch (Exception $e) { // // 输出异常信息 // echo '异常信息:' . $e->getMessage() . '<br>'; // echo '异常代码:' . $e->getCode() . '<br>'; // echo '异常的文件名:' . $e->getFile() . '<br>'; // echo '异常文件代码所在行数:' . $e->getLine() . '<br>'; //} // 自定义的异常类 class MyException extends Exception { public function __toString() { return <<< HELLO <table border="1" cellspacing="0" cellpadding="5"> <tr bgcolor="wheat"> <th>错误信息</th> <th>代码</th> <th>文件</th> <th>行号</th> </tr> <tr> <td>$this->message</td> <td>$this->code</td> <td>$this->file</td> <td>$this->line</td> </tr> </table> HELLO; } } // 获取到表单数据 $email = $_GET['name']; $pwd = $_GET['password']; //echo $email . ':' . $pwd; //die; // 使用自定义的异常子类 try { if (filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) throw new MyException('邮箱格式不对', 305); } catch (MyException $e) { echo $e; }运行实例 »
点击 "运行实例" 按钮查看在线实例