抽象类:是基于类来说,其本身就是类,只是一种特殊的类,不能直接实例,可以在类里定义方法,属性。类似于模版,规范后让子类实现详细功能。

接口:主要基于方法的规范,有点像抽象类里的抽象方法,只是其相对于抽象方法来说,更加独立。可让某个类通过组合多个方法来形成新的类。

抽象类与接口的相同点:

1、都是用于声明某一种事物,规范名称、参数,形成模块,未有详细的实现细节。

2、都是通过类来实现相关的细节工作

3、语法上,抽象类的抽象方法与接口一样,不能有方法体,即{}符号

4、都可以用继承,接口可以继承接口形成新的接口,抽象类可以继承抽象类从而形成新的抽象类

抽象类与接口的不同点:

1、抽象类可以有属性、普通方法、抽象方法,但接口不能有属性、普通方法、可以有常量

2、抽象类内未必有抽象方法,但接口内一定会有“抽象”方法

3、语法上有不同

4、抽象类用abstract关键字在类前声明,且有class声明为类,接口是用interface来声明,但不能用class来声明,因为接口不是类。

5、抽象类的抽象方法一定要用abstract来声明,而接口则不需要

6、抽象类是用extends关键字让子类继承父类后,在子类实现详细的抽象方法。而接口则是用implements让普通类在类里实现接口的详细方法,且接口可以一次性实现多个方法,用逗号分开各个接口就可

使用快捷键win+r打开运行输入control然后确定进入控制面板,点击程序和功能进入。
进入程序和功能后点击启用或关闭windows功能。
勾选Hyper-V然后确定并重启。

任务管理器->性能->CPU,确认虚拟化已启用。

管理员模式打开CMD,bcdedit /set hypervisorlaunchtype Auto,然后重启

官方文档中的代码实测有误

return [
    'bind'    =>    [
        'UserLogin' => 'app\event\UserLogin',
        // 更多事件绑定
    ],
    'listen'  =>    [
        'UserLogin'    =>    ['app\listener\UserLogin'],
        // 更多事件监听
    ],
];

实际表现应该是

return [
    'bind'    =>    [
        'ul' => 'UserLogin',
        // 更多事件绑定
    ],
    'listen'  =>    [
        'UserLogin'    =>    ['app\listener\UserLogin'],
        // 更多事件监听
    ],
];

这样使用

Event::trigger('UserLogin');

或者

Event::trigger('ul');

或者

event('UserLogin');

或者

event('ul');

都能够生效,也就是说,event.php 中的 bind 配置实质上起到的是一个别名的功能,直接不配置也不会影响使用

- 阅读剩余部分 -

    SELECT
*,
ROUND(
    6378.138 * 2 * ASIN(
        SQRT(
            POW(
                SIN((
                        37.921289 * PI()/ 180-latitude * PI()/ 180 
                        )/ 2 
                ),
                2 
                )+ COS( 37.921289 * PI()/ 180 )* COS( latitude * PI()/ 180 )* POW(
                SIN((
                        112.648139 * PI()/ 180-longitude * PI()/ 180 
                        )/ 2 
                ),
                2 
            )))* 1000 
) AS distance 
FROM t_store ORDER BY distance ASC