分类 笔记 下的文章

删除数据一般分为软删除硬删除,软删除指在数据表中建立一个isDeleted字段,若删除本数据只需标记此字段而非实际删除数据,硬删除是指将数据从硬盘中实际删除。

以往我一般习惯性的采用硬删除的方式,将关联数据使用一个事务完成删除,但这样的缺点也显而易见,不具备可恢复性、如果增加新的关联数据必须一起删除,前阵子我开发的一个项目就出现了后期关联的新数据没在删除操作中加上,导致删除数据后浏览数据出错的情况。

今天看到的一篇文章中的几句话后就想通了,原文如下:

订单不是被删除的,是被“取消”的。订单取消得太晚,还会产生花费。
员工不是被删除的,是被“解雇”的(也可能是退休了)。还有相应的补偿金要处理。
职位不是被删除的,是被“填补”的(或者招聘申请被撤回)。

显然,硬删除大多数时候并不符合实际业务的客观发展,如果滥用硬删除会抹掉很多业务中的细节,破坏数据的一致性,所以我的结论是:“尽量避免硬删除,除非这条数据真的不再具有任何意义”

文章链接:https://blog.csdn.net/sinat_42483341/article/details/105723458

依赖注入:A类需要调用B类的功能,所以需要一个B类的对象,一般的写法是在A类中直接实例化B类以获取对象,而依赖注入则是在A类外部实例化B类,然后将B类的对象通过参数注入到A类。

控制反转:将类与类之间的依赖关系管理由内部提到外部进行管理,以此降低程序组件间的耦合度。

ReflectionClass反射类:可用于判断一个类是否可以被实例化、是否有构造函数、获取构造函数的参数、判断参数是否为一个依赖类。

使用反射,我们可以实现从外部判断一个类需要依赖哪些其他类,然后使用程序自动将被依赖类实例化,注入要调用的类。

下面是一个浅显易懂的例子,Controller类需要依赖Db类,所以在构造函数中将Db作为参数,我们在test.php中编写一个maker()函数用于自动创建类的对象,当被依赖的类需要依赖其它类时,maker()函数会被递归调用。

- 阅读剩余部分 -

<?php

//接口类,约束参数与方法
interface Db
{
    public function execute($param);
}

//实现类,按接口约束的方法实现功能
class Db_Mysql implements Db
{
    public function execute($param)
    {
        print_r($param);
    }
}

在脚本中使用 spl_autoload_register(['className','functionName']) 进行注册,需要注意这个方法需要是个静态方法,且需要有一个参数。

调用找不到的类时PHP会自动调用这里注册的方法,并给此方法提交一个参数,内容为不存在的类(含命名空间),此方法只需要根据命名空间判断找不到的类是不是需要自己引入的类(比如自己程序的自动加载与Composer的自动加载共存时),是的话加载文件并返回 true,不是的话返回 false

spl_autoload_register(['className','functionName']) 可以多次调用注册多个方法,PHP会按照注册顺序依次调用,直到找不到的类被自动加载为止。

参考:官方文档

有时会在LTSC 2019自行安装的应用商店中出现,按Win+R打开运行,输入inetcpl.cpl,打开高级,下拉找到并勾选使用TLS1.2,应用即可。

捕获.jpg

git config --list
# 查看设置

git config user.name
# 查看用户名
git config user.password
# 查看密码
git config user.email
# 查看邮箱

git config user.name "用户名"
# 设置用户名
git config user.password "密码"
# 设置密码
git config user.email "邮箱"
# 设置邮箱

git config --global user.name
# 查看全局用户名
git config --global user.password
# 查看全局密码
git config --global user.email
# 查看全局邮箱

git config --global user.name "用户名"
# 设置全局用户名
git config --global user.password "密码"
# 设置全局密码
git config --global user.email "邮箱"
# 设置全局邮箱

import win32ui

dlg = win32ui.CreateFileDialog(1)
dlg.SetOFNInitialDir("默认打开路径")
dlg.DoModal()
path = dlg.GetPathName()
# 获取选择文件的绝对路径

如果报错,需要安装pywin32

pip install pywin32