.請自我介紹一下?
答:我叫xxx,來自北京,20xx年畢業于xx大學計算機xx系,畢業后在武漢從事了x年的php開發工作,公司是一個外包公司,主要做微信開發,公眾號推廣,商城,論壇的開發
2.你在公司負責那些項目?
答:由于我們公司是一個外包公司,不可能只做一個項目,公司的項目都是交叉進行的,論壇,微信,商城我都做過?
3.你為什么來深圳?
答:因為我哥在這邊,父母也希望兄弟間有個照應,而且深圳是一線城市,技術也比廣西前沿一些
4.武漢使用什么前端框架和后端框架?
答:根據自己的區域回答
5.你做過那些模塊?
答:登陸注冊,商品管理,購物車模塊,訂單管理
6.你們公司是使用什么框架?
答:我們公司采用的是TP框架,運用的mysql+apache+php進行開發,因為TP框架是一個免費開源的,輕量級的php開發框架,而且是我們中國人自己開發的,也是國內用的比較多的,各種資料也比較齊全
7.mvc是什么?相互間有什么關系?
答:mvc是一種開發模式,主要分為三部分:m(model),也就是模型,負責數據的操作;v(view),也就是視圖,負責前后臺的顯示;c(controller),也就是控制器,負責業務邏輯
客戶端請求項目的控制器,如果執行過程中需要用到數據,控制器就會到模型中獲取數據,再將獲取到的數據通過視圖顯示出來
8.oop是什么?
答:oop是面向對象編程,面向對象編程是一種計算機編程架構,OOP 的一條基本原則是計算機程序是由單個能夠起到子程序作用的單元或對象組合而成。
1
OOP具有三大特點
1、封裝性:也稱為信息隱藏,就是將一個類的使用和實現分開,只保留部分接口和方法與外部聯系,或者說只公開了一些供開發人員使用的方法。于是開發人員只 需要關注這個類如何使用,而不用去關心其具體的實現過程,這樣就能實現MVC分工合作,也能有效避免程序間相互依賴,實現代碼模塊間松藕合。
2、繼承性:就是子類自動繼承其父級類中的屬性和方法,并可以添加新的屬性和方法或者對部分屬性和方法進行重寫。繼承增加了代碼的可重用性。PHP只支持單繼承,也就是說一個子類只能有一個父類。
3、多態性:子類繼承了來自父級類中的屬性和方法,并對其中部分方法進行重寫。于是多個子類中雖然都具有同一個方法,但是這些子類實例化的對象調用這些相同的方法后卻可以獲得完全不同的結果,這種技術就是多態性。多態性增強了軟件的靈活性。
1、易維護
采用面向對象思想設計的結構,可讀性高,由于繼承的存在,即使改變需求,那么維護也只是在局部模塊,所以維護起來是非常方便和較低成本的。
2、質量高
在設計時,可重用現有的,在以前的項目的領域中已被測試過的類使系統滿足業務需求并具有較高的質量。
3、效率高
在軟件開發時,根據設計的需要對現實世界的事物進行抽象,產生類。使用這樣的方法解決問題,接近于日常生活和自然的思考方式,勢必提高軟件開發的效率和質量。
4、易擴展
由于繼承、封裝、多態的特性,自然設計出高內聚、低耦合的系統結構,使得系統更靈活、更容易擴展,而且成本較低。
9.smarty是什么,有什么作用?
回答一:smarty是用php寫出來的模板引擎,也是目前業界最著名的php模板引擎之一
它分離了邏輯代碼和外在的顯示,提供了一種易于管理和使用的方法,用來將混雜的php邏輯代碼與html代碼進行分離
回答二:smarty是php中最著名的引擎框架之一,我們公司使用的是TP框架,已經封裝好了smarty模板,所以沒有單獨使用過
回答三: smarty是個模板引擎,最顯著的地方就是有可以把模板緩存起來。一般模板來說,都是做一個靜態頁面,然后在里面把一些動態的部分用一切分隔符切開,然后在PHP里打開這個模板文件,把分隔符里面的值替換掉,然后輸出來,你可以看下PHPLib里面的template部分。
而smarty設定了緩存參數以后,第一次運行時候會把模板打開,在php替換里面值的時候把讀取的html和php部分重新生成一個臨時的php文件,這樣就省去了每次打開都重新讀取html了。如果修改了模板,只要重新刷下就行了。
10.TP框架有哪些優點?
答:TP框架是我們中國人自己開發的框架,各種資料比較齊全,國內用的比較多,比較簡單和方便,而且是免費開源的
11.TP的特性有哪些?
1.多表查詢非常方便,在model中幾句代碼就可以完成對多表的關聯操作 2.融合了smarty模板,使前后臺分離 3.支持多種緩存技術,尤其對memcache技術支持非常好 4.命名規范,模型,視圖,控制器嚴格遵循命名規則,通過命名一一對應 5.支持多種url模式 6.內置ajax返回方法,包括xml,json,html等 7.支持應用擴展,類庫擴展,驅動擴展等
12.TP框架中的大字母函數?
U:對url的組裝 A:內部實例化控制器 S:緩存處理 R:調用某個控制器的操作方法 D:實例化自定義模型類 M:實例化基礎模型類 I:獲取參數 L:設置或者獲取當前語言 C:設置或獲取,保存配置
13.請介紹一下laravel框架?
答: laravel框架的設計思想比較先進,非常適合應用各種開發模式,作為一個框架,它為你準備好了一切,composer是php的未來,沒有composer,php肯定要走向沒落
laravel框架最大的特點和優秀之處就是集合了php比較新的特點,以及各種各樣的設計模式,Ioc模式,依賴注入等
14.laravel有那些特點?
回答一:
1.強大的rest router:用簡單的回調函數就可以調用,快速綁定controller和router 2.artisan:命令行工具,很多手動的工作都自動化 3.可繼承的模板,簡化view的開發和管理 4.blade模板:渲染速度更快 5.ORM操作數據庫 6.migration:管理數據庫和版本控制 7.測試功能也很強大 8.composer也是亮點
回答二: laravel框架引入了門面,依賴注入,Ioc模式,以及各種各樣的設計模式等
15.請簡述一下數據庫的優化?
答:數據庫的優化可以從四個方面來優化:
1.從結構層: web服務器采用負載均衡服務器,mysql服務器采用主從復制,讀寫分離
2.從儲存層: 采用合適的存儲引擎,采用三范式
3.從設計層: 采用分區分表,索引,表的字段采用合適的字段屬性,適當的采用逆范式,開啟mysql緩存
4.sql語句層:結果一樣的情況下,采用效率高,速度快節省資源的sql語句執行
16.如何解決異常處理?
答: 拋出異常:使用try…catch,異常的代碼放在try代碼塊內,如果沒有觸發異常,則代碼繼續執行,如果異常被觸發,就會 拋出一個異常。Catch代碼塊捕獲異常,并創建一個包含異常信息的對象。$e->getMessage(),輸出異常的錯誤信息。
解決異常:使用set_error_handler函數獲取異常(也可以使用try()和catch()函數),然后使用set_exception_handler()函數設置默認的異常處理程序,register_shutdown_function()函數來執行,執行機制是,php要把調入的函數調入到內存,當頁面所有的php語句都執行完成時,再調用此函數
17.前端?
答:我在工作中處理前端的功能,一般就是用ajax向后臺請求數據,然后返回數據在前臺頁面中顯示出來。我從來沒有獨立的完整的將html和css樣式都一個人完成,如果公司實在有這樣的需求的話,我可能會找一些前臺的模板或者說是前端的框架,比如說h—ui等等
18.權限管理(RBAC)的實現?
1.首先創建一張用戶表:id name auto(保存格式為:控制器-方法)
2.然后在后臺中創建一個基類控制器,控制器里封裝一個構造方法,當用戶登陸成功后,使用TP框架中封裝好的session函數獲取保存在服務器中的session id,然后實例化模型,通過用戶id獲取保存在數據表中的auth數據,使用explode函數分割獲取到的數據,并使用一個數組保存起來,然后使用TP框架中封裝好的常量獲取當前控制器和方法,然后把他們組裝成字符串,使用in_array函數進行判斷該數組中是否含有當前獲取到的控制器和方法,如果沒有,就提示該用戶沒有權限,如果有就進行下一步操作
19.支付功能的實現?
答:
20.怎么保證促銷商品不會超賣?
答:這個問題是我們當時開發時遇到的一個難點,超賣的原因主要是下的訂單的數目和我們要促銷的商品的數目不一致導致的,每次總是訂單的數比我們的促銷商品的數目要多,當時我們的小組討論了好久,給出了好幾個方案來實現:
第一種方案:在每次下訂單前我們判斷促銷商品的數量夠不夠,不夠不允許下訂單,更改庫存量時加上一個條件,只更改商品庫存大于0的商品的庫存,當時我們使用ab進行壓力測試,當并發超過500,訪問量超過2000時,還是會出現超賣現象。所以被我們否定了。
第二種方案:使用mysql的事務加排他鎖來解決,首先我們選擇數據庫的存儲引擎為innoDB,使用的是排他鎖實現的,剛開始的時候我們測試了下共享鎖,發現還是會出現超賣的現象。有個問題是,當我們進行高并發測試時,對數據庫的性能影響很大,導致數據庫的壓力很大,最終也被我們否定了。
第三種方案:使用文件鎖實現。當用戶搶到一件促銷商品后先觸發文件鎖,防止其他用戶進入,該用戶搶到促銷品后再解開文件鎖,放其他用戶進行操作。這樣可以解決超賣的問題,但是會導致文件得I/O開銷很大。
最后我們使用了redis的隊列來實現。將要促銷的商品數量以隊列的方式存入redis中,每當用戶搶到一件促銷商品則從隊列中刪除一個數據,確保商品不會超賣。這個操作起來很方便,而且效率極高,最終我們采取這種方式來實現
碼規范是對代碼質量的規定。在 Laravel 項目中應用編碼規范可以提高團隊合作的效率,確保代碼可讀性并促進可維護性。Laravel 提供了一些推薦的編碼規范,但最終的編碼規范是您可以根據項目需求進行優化的。
Laravel 編碼規范的標準
* 文件名和命名
* 代碼結構
* 代碼邏輯
* 注釋
* 測試
文件名和命名
* 使用短命名的變量和函數名稱。
* 采用一致的命名慣例。
* 避免使用大寫或非標準的命名。
代碼結構
* 組織你的代碼以提高可讀性。
* 建立清晰的目錄結構。
* 用命名空間來分組您的代碼。
代碼邏輯
* 編寫清晰易讀的代碼。
* 避免冗余或不必要的復雜性。
* 使用合乎邏輯的函數名稱和注釋。
注釋
* 在代碼中添加詳細的注釋。
* 確保注釋準確且易于理解。
* 不要對簡單的代碼添加注釋。
測試
* 編寫廣泛的單元測試。
* 確保您的代碼覆蓋率高。
* 定期檢查并更新您的測試。
最佳實踐
* 遵守 Laravel 建議的編碼規范。
* 定期審查您的編碼以確保其符合規范。
* 建立團隊編碼規范并 遵守它們。
常見問題
* 代碼格式化問題:確保您的代碼符合 Laravel 的編碼規范。
* 命名沖突:確保您的代碼中沒有重名的變量或函數名。
* 測試覆蓋率不足:確保您的測試覆蓋您的代碼的各個方面。
結論
Laravel 編碼規范可以提高團隊合作的效率,確保代碼的可讀性并促進可維護性。通過遵循 Laravel 建議的編碼規范,您可以寫出高質量的 Laravel 代碼。
Laravel 5.6 文檔 ] 序言 —— 升級指南,文章轉自laravel學院。
預計升級時間:10-30分鐘
PHP
Laravel 5.6 需要 PHP 7.1.3 或更高版本。
更新依賴
在 composer.json
中更新 laravel/framework
依賴到 5.6.*
,更新 fideloper/proxy
依賴到 ~4.0
。
此外,如果你使用下以下官方擴展包,也要升級它們到最新版本:
Dusk (升級到 ~3.0
)
Passport (升級到 ~5.0
)
Scout (升級到 ~4.0
)
當然,不要忘了檢查應用所使用的第三方擴展包是否支持 Laravel 5.6,如果需要升級的話也要更新。
Symfony 4
Laravel 底層使用的所有 Symfony 組件都已經升級到 Symfony ~4.0
版本。如果你在應用代碼中使用了 Symfony 組件,需要查看 Symfony 更新日志以確認是否需要修改代碼。
PHPUnit
需要更新應用的 phpunit/phpunit
依賴到 ~7.0
。
數組
Arr::wrap 方法
在 Laravel 5.6 中,傳遞 null
到 Arr::wrap
方法將會返回空數組。
Artisan
optimize 命令
之前版本中廢棄的 optimize
命令已經被徹底移除。由于 PHP 自身的性能優化,optimize
命令已經不能給應用提供顯著的性能提升,所以,你需要從 composer.json
文件的 scripts
部分移除 php artisan optimize
。
Blade
HTML 實體編碼
在之前版本的 Laravel 中,Blade 不會對 HTML 實體進行雙重編碼。這并不是底層 htmlspecialchars 函數的默認行為,而且會在渲染內容或傳遞內聯 JSON 內容到 JavaScript 框架時導致預期之外的結果。
在 Laravel 5.6 中,Blade 以及輔助函數 e
默認會對特殊字符進行雙重編碼,從而與 PHP 底層 htmlspecialchars
函數的默認行為保持一致。如果你想要維持不進行雙重編碼的舊狀,可以使用 Blade::withoutDoubleEncoding
方法:
<?php namespace App\Providers; use Illuminate\Support\Facades\Blade; use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider { /** * Bootstrap any application services. * * @return void */ public function boot() { Blade::withoutDoubleEncoding(); } }
緩存
頻率限制器 tooManyAttempts 方法
該方法簽名中未使用的 $decayMinutes
參數被移除。如果你通過自己的實現重寫了該方法,也要從方法簽名中移除該參數。
數據庫
Morph 列的索引順序
為了獲得更好的性能,遷移方法 morphs
構建的列索引順序倒過來了,如果你在某個遷移中使用了 morphs
方法,嘗試運行該遷移的 down
方法時會報錯。如果應用還在開發中,可以使用 migrate:fresh
命令重構數據庫結構;如果應用已經上線,需要顯式傳遞索引名稱到 morphs
方法。
MigrationRepositoryInterface 新增方法
MigrationRepositoryInterface
中新增了一個 getMigrationsBatches
方法。如果非常不巧你正在自定義該類的實現,需要添加這個方法的實現。你可以以框架的默認實現作為示例。
Eloquent
getDateFormat 方法
getDateFormat
方法的可見性從 protected
調整為 public
。
哈希
新配置文件
所有哈希配置現在位于獨立的 config/hashing.php
配置文件。你可以拷貝一份默認配置文件到你的應用。大多數情況下,我們都會將 bcrypt
驅動作為默認驅動。不過,也支持 argon
。
輔助函數
e
在之前版本的 Laravel 中,Blade (以及輔助函數 e
)不會對 HTML 實體進行雙重編碼。這并不是底層 htmlspecialchars 函數的默認行為,而且會在渲染內容或傳遞內聯 JSON 內容到 JavaScript 框架時導致預期之外的結果。
在 Laravel 5.6 中,Blade 以及輔助函數 e
默認會對特殊字符進行雙重編碼,從而與 PHP 底層 htmlspecialchars
函數的默認行為保持一致。如果你想要維持不進行雙重編碼的舊狀,可以傳遞 false
作為第二個參數到 e
函數:
<?php echo e($string, false); ?>
日志
新配置文件
所有的日志配置現在都存放在獨立的 config/logging.php
配置文件。你可以拷貝一份默認的配置文件到你的應用然后基于應用需要進行設置。
log
和 log_level
配置項都可以從配置文件 config/app.php
里移除了。
configureMonologUsing 方法
如果你在使用 configureMonologUsing
方法為應用自定義 Monolog 實例,現在需要創建一個 custom
日志頻道。更多關于如何創建自定義頻道的信息,可以查看完整的日志文檔。
日志 Writer 類
Illuminate\Log\Writer
類被重命名為 Illuminate\Log\Logger
,如果你在應用的某個類中對這個類進行了顯式的類型提示作為依賴注入,需要更新該類的引用為新的類名。或者,作為替代方案,你可以考慮將類型提示調整為標準的 Psr\Log\LoggerInterface
接口。
Illuminate\Contracts\Logging\Log 接口
該接口已經被移除,因為它和 Psr\Log\LoggerInterface
接口完全重合,需要將引用它的地方都調整為 Psr\Log\LoggerInterface
接口。
郵件
withSwiftMessage 回調
在之前版本的 Laravel 中,使用 withSwiftMessage
注冊的 Swift 消息自定義回調函數在內容已經被編碼并添加到消息后被調用。這些回調現在在內容被添加前調用,從而允許你自定義編碼以及其他消息選項。
分頁
Bootstrap 4
分頁器生成的分頁鏈接現在默認使用 Bootstrap 4,要讓分頁器生成 Bootstrap 3 鏈接,需要在 AppServiceProvider
的 boot
方法中調用 Paginator::useBootstrapThree
方法:
<?php namespace App\Providers; use Illuminate\Pagination\Paginator; use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider { /** * Bootstrap any application services. * * @return void */ public function boot() { Paginator::useBootstrapThree(); } }
資源
original 屬性
資源響應的 original
屬性現在被設置為原始模型而不是 JSON 字符串/數組。這樣在測試中就可以更好地檢查響應的模型。
路由
返回新創建的模型
從路由中直接返回新創建的 Eloquent 模型時,響應狀態碼由 200
調整為 201
,如果應用的任意相應測試顯式期望 200
狀態碼,那么需要將它們修改為 201
。
信任代理
由于信任代碼功能使用的底層 Symfony HttpFoundation 有改動,所以必須微調 App\Http\Middleware\TrustProxies
中間件。
$headers
屬性之前是個數組,現在是一個接收幾個不同值的屬性。例如,要信任所有轉發頭,需要像這樣更新 $headers
屬性:
use Illuminate\Http\Request; /** * The headers that should be used to detect proxies. * * @var string */ protected $headers=Request::HEADER_X_FORWARDED_ALL;
更多關于 $headers
變量值的信息可以查看完整的信任代理文檔。
驗證
ValidatesWhenResolved 接口
為了避免和 $request->validate()
方法沖突,ValidatesWhenResolved
接口/trait 的 validate
方法被重命名為 validateResolved
。
雜項
我們還鼓勵你查看 laravel/laravel
代碼倉庫的更新日志。盡管其中的很多更新不是必須的,但是你可以將應用中的這些文件與代碼倉庫保持同步。其中的一些更新已經在這篇升級指南中覆蓋到了,但是還有很多其他的小更新比如配置文件或注釋的微調,就不會一一指出。你可以通過 GitHub 比較工具 輕松查看變更以便選擇那些對你而言更為重要的更新。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。