Thinkphp6调用其他控制器
Thinkphp6相对于5改动还是挺大的,以前可以直接使用controller()
函数调用其他控制器,现在的助手函数中找不到这个函数了
直接在控制器中使用完整命名空间new一个对象,控制器会被自动加载,如果两个控制器都继承了基类可以在实例化时提交参数$this->app
$auth = new app\controller\Auth($this->app);
$auth->verify();
Thinkphp6相对于5改动还是挺大的,以前可以直接使用controller()
函数调用其他控制器,现在的助手函数中找不到这个函数了
直接在控制器中使用完整命名空间new一个对象,控制器会被自动加载,如果两个控制器都继承了基类可以在实例化时提交参数$this->app
$auth = new app\controller\Auth($this->app);
$auth->verify();
substr_count('module/controller/method', '/');
//返回结果:2
修改安装目录/libraries/config.default.php
中的$cfg['blowfish_secret']
即可,设置为一个较长的随机字符串。
依赖注入: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会按照注册顺序依次调用,直到找不到的类被自动加载为止。
参考:官方文档
import os
from tempfile import TemporaryFile
f = TemporaryFile('w+t', encoding='utf-8')
# 创建临时文件
f.write('数据1')
f.write('数据2')
# 写数据
f.seek(0)
print(f.read())
# 读取输出
f.close()
# 关闭并删除
import win32ui
dlg = win32ui.CreateFileDialog(1)
dlg.SetOFNInitialDir("默认打开路径")
dlg.DoModal()
path = dlg.GetPathName()
# 获取选择文件的绝对路径
如果报错,需要安装pywin32
pip install pywin32
import win32com.client
def check_process(process_name):
WMI = win32com.client.GetObject('winmgmts:')
processCodeCov = WMI.ExecQuery('select * from Win32_Process where Name="%s"' % process_name)
if len(processCodeCov) > 0:
return True
else:
return False
import os
os.system("指令")
# 显示窗口执行cmd指令
os.popen("指令")
# 隐藏窗口执行cmd指令