ThinkPHP5.0升级PHP8.0教程

668 阅读1分钟

首先,我的程序支持PHP7.0,现在改动以支持PHP8.0,记录一下方便大家参考。 由于

行数仅供参考,一般不会浮动10行。

修改前请先备份,预留充分的时间,因为本教程仅提供几个小点作为参考,修改后还需测试功能再继续修改。

由于版本跨度大,逻辑不同,需求不同,所需要的更改也就不同。

首先是App.php文件,路径在thinkphp\library\think\App.php

修改1:

在400行的函数下,新增 一行 result=;,以解决returnresult = '';,以解决return result的报错。

`private static function getParamValue(param, &vars, $type) {

    $result = '';
    //新增`
    
    

修改2:

第406行:

// $class = $param->getClass();//注释掉

新增为:

`class=null;if(class = null; if (type instanceof ReflectionNamedType && !type->isBuiltin()) { class = $type->getName(); }

`

修改3:

第440行左右:

throw new \InvalidArgumentException('method param miss:' . $name);

也注释掉,改为:

if (empty($name)) { throw new \InvalidArgumentException("Method param missing: " . ($name ?? 'unknown')); }

奈何本人记性不太好,记得此处ifelse有改动过,但又恢复了,有点模糊,如果读者改完还是不行,那就参考下面的代码,仅此局部。

` if (class) { className = class>getName();class->getName(); bind = Request::instance()->$name;

        if ($bind instanceof $className) {
            $result = $bind;
        } else {
            if (method_exists($className, 'invoke')) {
                $method = new \ReflectionMethod($className, 'invoke');

                if ($method->isPublic() && $method->isStatic()) {
                    return $className::invoke(Request::instance());
                }
            }

            $result = method_exists($className, 'instance') ?
            $className::instance() :
            new $className;
        }
    }elseif (1 == $type && !empty($vars)) {
        $result = array_shift($vars);
    } elseif (0 == $type && isset($vars[$name])) {
        $result = $vars[$name];
    } elseif ($param->isDefaultValueAvailable()) {
        $result = $param->getDefaultValue();
    } else {
        // php8
        // throw new \InvalidArgumentException('method param miss:' . $name);
        if (empty($name)) {
            throw new \InvalidArgumentException("Method param missing: " . ($name ?? 'unknown'));
        }
    }
    `

修改4:

Query.php文件,路径在thinkphp\library\think\db\Query.php 第400行:

$seq = (ord($value{0}) % $rule['num']) + 1;

改为

$seq = (ord($value[0]) % $rule['num']) + 1;

> 以上修改可供参考,以下意义不大,跨度大,逻辑不同,需求不同,所需要的更改也就不同。

时间问题,我撤回了修改。

修改5:

如果你的控制器像我这个写的,那么需要删除Request

public function edit(Request $request, $id)

修改后

public function edit($request, $id)

但是如果你的代码直接有类似下面的会报错:

$file = $request->file('file');

以上先不动,下面的更合适

public function edit(Request $request, $id)

有Request $request这样的,改为 Request $request = null

检查$request是否为null

if ($request === null) {

return alert('表单不完整','',2);

}

file=file = request->file('file');

(掘金编辑器什么鬼东西)

image.png