
批改狀態(tài):合格
老師批語:JIT,是php8最大的亮點(diǎn)
HP 8.0 重大版本更新于2020年11 月 26 日正式開放下載,新版本引入了可選的 JIT 編譯器,將現(xiàn)有的 JSON 支持集成到核心(不再是可選),并增加了對(duì)屬性、聯(lián)合類型,靜態(tài)返回類型和其他附加語言的支持,越來越走向強(qiáng)類型語言了,為了適應(yīng)新環(huán)境,Laravel和ThinkPHP也及時(shí)更新了版本,支持PHP8,不過相對(duì)PHP7,在安裝和配置方面有了些變化,如要開啟SSL、mbString等擴(kuò)展才能正常使用等問題,為了便于自己學(xué)習(xí),寫下博文,方便以后查找。我的環(huán)境是Windows 10 2004版,PHPStudy是8.1.1.2。
我目前常用集成開發(fā)環(huán)境是PHPStudy,但也許是為了穩(wěn)定性,沒及時(shí)增加PHP8,于是我就手動(dòng)增加PHP8了。PHP8下載是官方地址https://windows.php.net/download,目前已經(jīng)更新到了8.0.1版了。
將下載的壓縮包解壓到PHPStudy的軟件的目錄Extensions\php下,然后解壓命名,我命名為php8.0.1nts。壓縮文件解壓后會(huì)發(fā)現(xiàn)并沒有 php.ini 文件,取而代之的是以下兩個(gè)文件:
php.ini-production和php.ini-development,將 php.ini-development 重命名為 php.ini 并打開。
在php.ini中配置PHP8 擴(kuò)展所在目錄,搜索 extension_dir 關(guān)鍵字,然后將路徑改指向?yàn)閜hp8.0.1nts/ext目錄的絕對(duì)路徑,路徑分隔符,正斜杠或反斜杠都支持,不過還是建議是正斜杠。
在系統(tǒng)中配置系統(tǒng)環(huán)境變量,就是將php8.0.1nts目錄加入系統(tǒng)環(huán)境變量Path中
現(xiàn)在可以在命令提示符中輸入php -v查看版本了
一般教程到上面就結(jié)束了,可以是我接著composer下載ThinkPHP6和Laravel8卻報(bào)各種錯(cuò)誤。下面是其中的一個(gè)錯(cuò)誤截圖
目前百度查了下,找到了PHP中文網(wǎng)上藏色散人轉(zhuǎn)發(fā)LearnKu網(wǎng)翻譯Laravel8官方網(wǎng)的教程,鏈接地址是http://ipnx.cn/phpkj/laravel/466988.html,我滿心歡喜跟著一番猛如虎的操作,可卻是一堆紅色報(bào)錯(cuò),我想轉(zhuǎn)發(fā)人也沒親身實(shí)踐,也沒真正搞明白如何讓PHP8支持Laravel8和ThinkPHP6。不過我從報(bào)錯(cuò)信息中看到最多的關(guān)鍵詞就是extension,即是擴(kuò)展,框架需要擴(kuò)展,而PHP默認(rèn)是屏蔽的,需要我們手動(dòng)修改php.ini,開啟擴(kuò)展。在命令提示符查看擴(kuò)展命名是php -m,你可以通過它看php是否開啟錯(cuò)誤中擴(kuò)展。
ThinkPHP6需要開啟 openssl和mbstring 2個(gè)擴(kuò)展,而Laravel則要開啟 openssl、mbstring和fileinfo 3個(gè)擴(kuò)展。開啟方法就是除掉php.ini中擴(kuò)展前面分號(hào)就可以,同時(shí)記得要重啟Apache才生效。
還要提醒大家一下,若上面擴(kuò)展未開啟,是無法通過composer下載ThinkPHP6或Laravel8的,一開始我還以為是源的事,切換為阿里云鏡像也沒用,所以想讓ThinkPHP6或Laravel8運(yùn)行在PHP8之上,上面3個(gè)擴(kuò)展是必須要開啟的。最后可通過命令行php -v或phpinfo()查看是否開啟。
現(xiàn)在大家可以happy的在PHP8上學(xué)習(xí)ThinkPHP6或Laravel8了,至于修改composer.json中php版本為8.0,你可以看我發(fā)的PHP中文網(wǎng)轉(zhuǎn)發(fā)的教程,然后composer update就可以了,經(jīng)測試再也不報(bào)錯(cuò)了。
本來是按教程安裝Laravel7的,但是看官方都已經(jīng)更新到了8.5.7了,而且說實(shí)在話,通過老師介紹Lavarel比較任性的就是模型目錄的處理,我是從ThinkPHP6過來的,還是喜歡目錄分明的框架,在Laravel8中作者也說了,為適應(yīng)大部分人要求,也隨這個(gè)潮流了,將模型歸為Models目錄中了。
Laravel 8安裝使用composer即可:composer create-project laravel/laravel laravel8
Laravel 8的翻譯文檔也是老師視頻中那個(gè)網(wǎng)站的https://learnku.com/docs/laravel/8.x
Laravel8和Laravel7一樣,必須配置路由才可正常訪問,這點(diǎn)要和ThinkPHP6區(qū)分開,中國特色的軟件都會(huì)考慮到中國人的懶,默認(rèn)提供了一些配置,讓你開箱即用,而國外程序員都是比較嚴(yán)謹(jǐn)?shù)?,追求功能。網(wǎng)頁訪問是配置routes/web.php,API是routes/api.php,我們先體驗(yàn)一番,在web.php中我添加了下面歡迎的訪問。
Route::get('/hello',function(){
echo 'Laravel 8 Hello World!';
});
在上面訪問的url中我們必須加上index.php才可正常訪問,否則給你報(bào)no input file specified
錯(cuò)誤,于是我到ThinkPHP6手冊(cè)中查找url重定向,復(fù)制過來放到public目錄的.htaccess文件中,結(jié)果還是報(bào)錯(cuò),不得不吐槽下,ThinkPHP官方手冊(cè)中Apache的重定向中index.php后面少了一個(gè)?號(hào),目前正常的是
<IfModule mod_rewrite.c>
Options +FollowSymlinks -Multiviews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?/$1 [QSA,PT,L]
</IfModule>
為什么單獨(dú)說下Laravel的路由寫法呢,開始之前,老師已經(jīng)提醒了Laravel7和Laravel8的寫法不同,Laravel7是Route::get('index','Article@list');
,而Laravel8是Route::get('list', [Article::class, 'list']);
,當(dāng)我滿懷信心時(shí),Laravel卻是給我報(bào)了一個(gè)大大的錯(cuò)。
我又查看了的確定義了類文件,也按psr-4規(guī)范,為什么給我報(bào)這個(gè)錯(cuò)呢,百度了下,原來Laravel8的路由routes/web.php還要手動(dòng)引入類,才可調(diào)用路由,因?yàn)槁酚芍?code>Article::class是PHP標(biāo)準(zhǔn)獲取類的全路徑(包括命名空間),而Laravel8的web.php默認(rèn)只有use Illuminate\Support\Facades\Route;
,于是定義一個(gè)控制類就要引入一次再寫路由,或都是使用Route::get('list', [App\Http\Controllers\Article::class, 'list']);
,這不是倒退了嗎?
又查了,網(wǎng)上有文章說在app\Providers目前下RouteServiceProvider.php有一個(gè)開關(guān),打開就不用這樣一個(gè)一個(gè)引入類了,可惜還是不行,它的作用我后面再說,我們還是先解決不用引用類就可直接定義路由的問題,我再看routes/web.php源碼,發(fā)現(xiàn)它竟然沒定義命名空間,它是全局空間,學(xué)習(xí)過PHP都知道,這種情況下要引用其它命名空間下的類就要手動(dòng)引入了,難道它沒使用 composer的autoload自動(dòng)加載,查源碼也加載了,到現(xiàn)在也沒找出原因,不過我找到解決方法了,就是加上命名空間namespace App\Http\Controllers;
再回頭說說RouteServiceProvider.php開關(guān),就是protected $namespace = 'App\\Http\\Controllers';
,默認(rèn)是注釋掉的,它真正的作用是將路由寫法恢復(fù)到Laravel7的寫法規(guī)則,而且不用在routes/web.php加命名空間解決一個(gè)個(gè)手動(dòng)引入控制類的問題了,要記住,它不能解決Laravel8路由寫法的問題,它是將路由寫法恢復(fù)到Laravel7的路由規(guī)范,就是說去掉這個(gè)注釋,路由寫法按Laravel7沒什么問題,如果你想使用Laravel8的寫法可以參考我上面解決的方案。
不得不說Laravel8有些默認(rèn)真是無法理解,建議打開上面RouteServiceProvider.php的開關(guān),此進(jìn)路由寫法同時(shí)支持Laravel7和Laravel8兩種規(guī)范,Laravel7路由不需要引入類,而Laravel8還是要引入類,統(tǒng)一引入可參考我上面的做法,目前測試沒問題。
最后說下,在解決問題過程中網(wǎng)上查了好多文章,都解釋這個(gè)開關(guān),但沒提出解決Laravel8路由手動(dòng)引入類的問題,我這篇算是比較全面了。
微信掃碼
關(guān)注PHP中文網(wǎng)服務(wù)號(hào)
QQ掃碼
加入技術(shù)交流群
Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號(hào)