Blogger Information
Blog 32
fans 2
comment 2
visits 23482
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
闭包绑定到对象/类,自定义异常类(0214)
暴风战斧
Original
558 people have browsed it

【编程思路】

属性通过闭包更新,将闭包通过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

Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:在7.0+, 异常类都实现的是Throwable ,它等于Exception + Error, 有空了解一下
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments