博客列表 >闭包绑定到对象/类,自定义异常类(0214)

闭包绑定到对象/类,自定义异常类(0214)

暴风战斧
暴风战斧原创
2020年03月21日 13:51:35554浏览

【编程思路】

属性通过闭包更新,将闭包通过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>';
运行实例 »

点击 "运行实例" 按钮查看在线实例

QPEO~~GLAI2WQ9F~K]KFI6L.png

实例
<?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>';
运行实例 »

点击 "运行实例" 按钮查看在线实例

2.png

【自定义异常类】

实例
<?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;
}
运行实例 »

点击 "运行实例" 按钮查看在线实例

QQ截图20200321134525.png

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议