原文連接: https://learnku.com/laravel/t...
討論請前往專業的 Laravel 開發者論壇: https://learnku.com/Laravel
探索下一次技術面試以前應該瞭解的前20個 Laravel 面試問題。php
主題: Laravel
難度: ⭐
Laravel 是一個免費的開放源代碼 PHP Web 框架,由 Taylor Otwell 建立,旨在遵循模型-視圖-控制器(MVC)架構模式開發 Web 應用程序。laravel
🔗 來源: codingcompiler.comgit
主題: Laravel
難度: ⭐
🔗 來源: mytectra.comgithub
主題: Laravel
難度: ⭐⭐
Laravel Migrations 相似於數據庫的版本控制,使團隊能夠輕鬆地修改和共享應用程序的數據庫架構。遷移一般與 Laravel 的架構生成器搭配使用,以輕鬆構建應用程序的數據庫架構。面試
🔗 來源: laravelinterviewquestions.com數據庫
主題: Laravel
難度: ⭐⭐
Facades 爲應用程序的服務容器中可用的類提供了一個 靜態 接口。Laravel facades 做爲服務容器中基礎類的靜態代理,提供了簡潔、表達性強的語法的優點,同時保持了比傳統靜態方法更高的可測試性和靈活性。express
全部的 Laravel facades 都是在 Illuminate\Support\Facades
命名空間中定義。
查看:數組
use Illuminate\Support\Facades\Cache; Route::get('/cache', function () { return Cache::get('key'); });
🔗 來源: laravel.com閉包
主題: Laravel
難度: ⭐⭐
Laravel 服務容器 是用於管理類依賴性和執行依賴性注入的工具。架構
🔗 來源: laravel.com
主題: Laravel
難度: ⭐⭐
Laravel 附帶的 Eloquent ORM 提供了一個漂亮、簡單的 ActiveRecord 實現,用於處理數據庫。每一個數據庫表都有一個對應的模型,用於與該表進行交互。經過模型,您能夠查詢表中的數據,以及將新記錄插入表中。
🔗 來源: laravel.com
主題: Laravel
難度: ⭐⭐
Laravel 事件提供了一個簡單的觀察者模式實現,容許訂閱和監聽應用程序中的事件。事件是程序檢測並處理的事故或事情。
如下是 Laravel 中的一些事件示例:
🔗 來源: mytectra.com
主題: Laravel
難度: ⭐⭐⭐
Laravel 的數據庫查詢構建器爲建立和運行數據庫查詢提供了方便,流暢的接口。它能夠用於在應用程序中執行大多數數據庫操做,而且能夠在全部支持的數據庫系統上工做。
Laravel 查詢構建器使用 PDO 參數綁定來保護應用程序免受 SQL 注入攻擊。無需清除做爲綁定傳遞的字符串。
查詢生成器的一些功能:
🔗 Source: laravel.com
主題: Laravel
難度: ⭐⭐⭐
遷移就像您數據庫的版本控制同樣,使您的團隊能夠輕鬆地修改和共享應用程序的數據庫架構。遷移一般與 Laravel 的架構構建器搭配使用,以輕鬆構建應用程序的數據庫架構。
要建立遷移,使用 make:migration
Artisan 命令:
php artisan make:migration create_users_table
新的遷移將放置在您的 database/migrations
目錄中。每一個遷移文件名都包含一個時間戳,該時間戳使 Laravel 能夠肯定遷移的順序。
🔗 來源: laravel.com
主題: Laravel
難度:⭐⭐⭐
Facades 爲應用程序的服務容器中可用的類提供「靜態」接口。與傳統的靜態方法調用不一樣,Facades 是可被 mock 的。咱們可使用 shouldReceive
方法 mock 對靜態外觀方法的調用,該方法將返回 Mockery
mock 的實例。
// 實際代碼 $value = Cache::get('key'); // 測試 Cache::shouldReceive('get') ->once() ->with('key') ->andReturn('value');
🔗 來源: laravel.com
主題: Laravel
難度: ⭐⭐⭐
當訪問 Eloquent 關係做爲屬性時,關係數據是 「Lazy Loaded」 的。這意味着直到您首次訪問該屬性,關係數據才被實際加載。可是,Eloquent 能夠在查詢父模型時 「Eager Load」 關係。
當咱們有嵌套對象時(例如書本->做者),Eager Loading 減輕了 N + 1
查詢的問題。咱們可使用 Eager Loading 將此操做減小爲僅2個查詢。
🔗 來源: FullStack.Cafe
主題: Laravel
難度: ⭐⭐⭐
Scopes 容許您輕鬆地在模型中複用查詢邏輯。要定義 scope,只需在模型方法的前面加上 scope:
class User extends Model { public function scopePopular($query) { return $query->where('votes', '>', 100); } public function scopeWomen($query) { return $query->whereGender('W'); } }
用法:
$users = User::popular()->women()->orderBy('created_at')->get();
有時您可能但願定義一個接受參數的 scope。Dynamic scopes 接受查詢參數:
class User extends Model { public function scopeOfType($query, $type) { return $query->whereType($type); } }
用法:
$users = User::ofType('member')->get();
🔗 來源: laravel.com
Topic: Laravel
Difficulty: ⭐⭐⭐
路由命名使得在生成重定向或者 URL 的時候更加方便地引用路由。您能夠經過將 name 方法加到路由定義上來指定命名路由:
Route::get('user/profile', function () { // })->name('profile');
您能夠爲控制器操做指定路由名稱:
Route::get('user/profile', 'UserController@showProfile')->name('profile');
爲路由分配名稱後,您能夠在生成 URL 或重定向時,經過全局路由功能使用路由名稱:
// Generating URLs... $url = route('profile'); // Generating Redirects... return redirect()->route('profile');
🔗 來源: laravelinterviewquestions.com
主題: Laravel
難度:⭐⭐⭐
閉包是一個匿名函數。閉包一般用做回調方法,而且能夠用做函數中的參數
function handle(Closure $closure) { $closure('Hello World!'); } handle(function($value){ echo $value; });
🔗 來源: stackoverflow.com
主題: Laravel
難度: ⭐⭐⭐
聚合函數是一種功能,可以將多行的值組合在一塊兒,做爲某些條件下的輸入,以造成具備更重要含義或度量值(例如集合,包或列表)的單個值。
如下是 Laravel 查詢構建器提供的一些聚合方法的列表:
$products = DB::table(‘products’)->count();
$price = DB::table(‘orders’)->max(‘price’);
$price = DB::table(‘orders’)->min(‘price’);
*$price = DB::table(‘orders’)->avg(‘price’);
$price = DB::table(‘orders’)->sum(‘price’);
🔗 來源: laravelinterviewquestions.com
主題: Laravel
難度:⭐⭐⭐
在 Laravel 中,反向路由會根據路由聲明生成 URL。反向路由使您的應用程序更加靈活。例如,下面的路由聲明告訴 Laravel 當請求的 URI 爲 「login」 時在 users 控制器中執行 「login」 操做。
Route::get(‘login’, ‘users@login’);
使用反向路由,咱們能夠建立到它的連接並傳遞咱們定義的任何參數。若是未提供可選參數,則會從生成的連接中刪除。
{{ HTML::link_to_action('users@login') }}
它將在視圖中建立相似 http://mysite.com/login 的連接。
🔗 來源: stackoverflow.com
主題: PHP
難度: ⭐⭐⭐
若是咱們的代碼須要對枚舉常量和值進行更多驗證,該怎麼辦?
根據使用狀況,我一般會使用相似如下的簡單內容:
abstract class DaysOfWeek { const Sunday = 0; const Monday = 1; // etc. } $today = DaysOfWeek::Sunday;
這是一個擴展的示例,能夠更好地服務於更普遍的案例:
abstract class BasicEnum { private static $constCacheArray = NULL; private static function getConstants() { if (self::$constCacheArray == NULL) { self::$constCacheArray = []; } $calledClass = get_called_class(); if (!array_key_exists($calledClass, self::$constCacheArray)) { $reflect = new ReflectionClass($calledClass); self::$constCacheArray[$calledClass] = $reflect - > getConstants(); } return self::$constCacheArray[$calledClass]; } public static function isValidName($name, $strict = false) { $constants = self::getConstants(); if ($strict) { return array_key_exists($name, $constants); } $keys = array_map('strtolower', array_keys($constants)); return in_array(strtolower($name), $keys); } public static function isValidValue($value, $strict = true) { $values = array_values(self::getConstants()); return in_array($value, $values, $strict); } }
咱們能夠將其用做:
abstract class DaysOfWeek extends BasicEnum { const Sunday = 0; const Monday = 1; const Tuesday = 2; const Wednesday = 3; const Thursday = 4; const Friday = 5; const Saturday = 6; } DaysOfWeek::isValidName('Humpday'); // false DaysOfWeek::isValidName('Monday'); // true DaysOfWeek::isValidName('monday'); // true DaysOfWeek::isValidName('monday', $strict = true); // false DaysOfWeek::isValidName(0); // false DaysOfWeek::isValidValue(0); // true DaysOfWeek::isValidValue(5); // true DaysOfWeek::isValidValue(7); // false DaysOfWeek::isValidValue('Friday'); // false
🔗 來源: stackoverflow.com
主題: PHP
難度: ⭐⭐⭐
使用自動加載器,PHP 容許在因爲錯誤而失敗以前最後一次加載類或接口。
PHP中的 spl_autoload_register()
函數能夠註冊任意數量的自動加載器,即便未定義類和接口也能夠自動加載。
spl_autoload_register(function ($classname) { include $classname . '.php'; }); $object = new Class1(); $object2 = new Class2();
在上面的示例中,咱們不須要包含 Class1.php 和 Class2.php。spl_autoload_register()
函數將自動加載 Class1.php 和 Class2.php。
🔗 來源: github.com/Bootsity
主題: PHP
難度:⭐⭐⭐
方法重載是使用具備不一樣簽名的相同方法名稱的現象。PHP 中函數簽名僅基於它們的名稱,而且不包含參數列表,所以不能有兩個具備相同名稱的函數,因此 PHP 不支持方法重載。
可是,您能夠聲明一個可變函數,它接受可變數量的參數。您可使用 func_num_args()
和 func_get_arg()
來傳遞參數並正常使用它們。
function myFunc() { for ($i = 0; $i < func_num_args(); $i++) { printf("Argument %d: %s\n", $i, func_get_arg($i)); } } /* Argument 0: a Argument 1: 2 Argument 2: 3.5 */ myFunc('a', 2, 3.5);
🔗 來源: github.com/Bootsity
主題: Laravel
難度: ⭐⭐⭐⭐
Traits 已被添加到 PHP 中,緣由很簡單s:PHP 不支持多重繼承。簡而言之,一個類不能一次性擴展至多個類。當你須要在其餘類也使用的兩個不一樣類中聲明的功能時,這變得很費力,結果是你必須重複執行代碼才能完成工做,而不會糾纏本身。
引入 Traits,它能使咱們聲明一種包含多個可複用方法的類。更好的是,它們的方法能夠直接注入到你使用的任何類中,而且你能夠在同一類中使用多個 Trait。讓咱們看一個簡單的 Hello World 示例。
trait SayHello { private function hello() { return "Hello "; } private function world() { return "World"; } } trait Talk { private function speak() { echo $this->hello() . $this->world(); } } class HelloWorld { use SayHello; use Talk; public function __construct() { $this->speak(); } } $message = new HelloWorld(); // returns "Hello World";
🔗 來源: conetix.com.au
主題: Laravel
難度: ⭐⭐⭐⭐
自動加載器定義了自動在代碼中包含 PHP 類的方法,而沒必要使用諸如 require 和 include 之類的語句。
🔗 來源: sitepoint.com
主題: PHP
難度: ⭐⭐⭐⭐
解釋此代碼以及 yield
的做用:
function a($items) { foreach ($items as $item) { yield $item + 1; } }
yield
關鍵字從生成器函數返回數據。生成器函數其實是編寫 Iterator
的更緊湊和有效的方式。它容許您定義一個函數,該函數將在您遍歷該函數時計算並返回值。
所以,問題中的函數與如下內容的函數幾乎相同:
function b($items) { $result = []; foreach ($items as $item) { $result[] = $item + 1; } return $result; }
只有一個區別,a()
返回一個 generator
,而 b()
只是一個簡單的 數組
。並且二者均可以被迭代。
函數的生成器版本未分配完整的數組,所以對內存的需求較少。生成器可用於解決內存限制。因爲生成器僅按需計算其 yielded 值,所以它們用於代替計算成本昂貴或沒法一次性計算的序列頗有用。
🔗 來源: stackoverflow.com
主題: PHP
難度: ⭐⭐⭐⭐⭐
相似 $$variable
的語法稱爲可變變量。
讓咱們嘗試 $$$:
$real_variable = 'test'; $name = 'real_variable'; // variable variable for real variable $name_of_name = 'name'; // variable variable for variable variable echo $name_of_name . '<br />'; echo $$name_of_name . '<br />'; echo $$$name_of_name . '<br />';
這是輸出:
name real_variable test
🔗 來源: guru99.com
原文連接: https://learnku.com/laravel/t...
討論請前往專業的 Laravel 開發者論壇: https://learnku.com/Laravel