记录老Thinkphp项目在win10系统运行遇到的一些问题

运行环境

win10
Laragon
php-7.4.19-Win32-vc15-x64
Nginx1.19
mysql5.7

需求

旧项目功能迭代,将项目拉到本地运行

问题

项目线上环境是Apache + PHP7.3,为了还原线上环境,需要下载一个PHP7.3
进入 PHP官网下载页, 发现最低下载版本也到了7.4,汗。经过一番搜索,终于找到了 windows.php.net - /downloads/releases/archives/

  1. 模板文件不存在的问题 ***.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public function fetch(string $template, array $data = []): void
{
if ('' == pathinfo($template, PATHINFO_EXTENSION)) {
// 获取模板文件名
$template = $this->parseTemplate($template);
}

// 模板不存在 抛出异常
if (!is_file($template)) {
throw new RuntimeException('template not exists:' . $template);
}

$this->template = $template;

extract($data, EXTR_OVERWRITE);

include $this->template;
}
1
2
3
4
5
6
7
8
9
vendor\topthink\framework\src\think\View.php
/**
* 默认驱动
* @return string|null
*/
public function getDefaultDriver()
{
return $this->app->config->get('view.type', 'php');
}

经过又一番搜索,TM的不管是中文还是英文搜索都找不到答案…只能自己看源码。好在源码写的还算简单,应该是缺少了模板的配置文件,项目里存在的配置文件config/template.php,源码里调用的应该是config/view.php。这个问题就解决了。出于好奇,我分别去看了ThinkPHP6文档think-view,发现 Github 里 README.md 写的是错的,文档写的是正确的,也不知道是啥历史遗留问题,issue里也有人提到这个。这个坑我踩了。

  1. PHP7.3、7.4的区别

以数组形式访问非数组 这种操作在7.4之前是被允许的

注意:

数组解引用非 string 的标量值会产生 null。 在 PHP 7.4.0 之前,它不会发出错误消息。 从 PHP 7.4.0 开始,这个问题产生 > E_NOTICE ; 从 PHP 8.0.0 开始,这个问题产生 E_WARNING 。

举个真实例子,如下:

1
2
3
4
5
6
<?php

$user = User::find(10086); // 这里返回null
if($user['validity'] == '0') {
...
}
  1. 执行 composer update -vvv 报错

thinkphp 版本6.0.0
composer版本 2.2.9
Script @php think service:discover handling the post-autoload-dump event returned with error code 255
经过一番搜索,有位朋友踩了坑并记录了下来,记一次thinkphp使用composer的踩坑记录,非常感谢这位朋友

吐槽

也不知道是不是我屏蔽了 CSDN 的缘故,遇到 ThinkPHP 框架相关问题搜索起来总是很费劲。为什么这么说呢,因为这套框架属于国人开发,国外几乎不会使用,但是使用的国人极少有分享精神将遇到的问题、解决思路分享出来。

Reference