你应该知道的 23 个以上的 Laravel 面试问题(已解答)
无论人们对 PHP 有何看法,它仍然是 Web 上最主流的服务器端语言,而 Laravel 是最受欢迎的 PHP 框架。根据 ZipRecruiter 的数据,美国 Laravel 程序员的平均年薪为 83,000 美元。不妨先来探索一下你在下一次技术面试前应该了解的 20 个 Laravel 面试问题。
Q1:什么是 Laravel?
主题:Laravel
难度:⭐
Laravel是一个免费的开源 PHP Web 框架,由 Taylor Otwell 创建,旨在开发遵循模型-视图-控制器 (MVC) 架构模式的 Web 应用程序。
🔗资料来源: codingcompiler.com
Q2:与其他 Php 框架相比,Laravel 有哪些优势?
主题:Laravel
难度:⭐
- 与其他相比,设置和定制过程简单快捷。
- 内置身份验证系统
- 支持多种文件系统
- 预装软件包,如 Laravel Socialite、Laravel cashier、Laravel elixir、Passport、Laravel Scout
- Eloquent ORM(对象关系映射)与 PHP 活动记录实现
- 内置命令行工具“Artisan”,用于创建代码框架、数据库结构并构建其迁移
🔗资料来源: mytectra.com
Q3:解释 Laravel 中的迁移
主题:Laravel
难度:⭐⭐
Laravel 迁移类似于数据库的版本控制,允许团队轻松修改和共享应用程序的数据库架构。迁移通常与 Laravel 的架构构建器配合使用,以轻松构建应用程序的数据库架构。
🔗来源: laravelinterviewquestions.com
Q4:Facade模式有什么用处?
主题:Laravel
难度:⭐⭐
Facades为应用程序服务容器中可用的类提供静态接口。Laravel Facades 充当服务容器中底层类的静态代理,提供简洁、富有表现力的语法优势,同时比传统的静态方法具有更高的可测试性和灵活性。
Laravel 的所有外观均在Illuminate\Support\Facades
命名空间中定义。
考虑:
use Illuminate\Support\Facades\Cache;
Route::get('/cache', function () {
return Cache::get('key');
});
🔗来源: laravel.com
Q5:什么是服务容器?
主题:Laravel
难度:⭐⭐
Laravel服务容器是一个用于管理类依赖关系和执行依赖注入的工具。
🔗来源: laravel.com
Q6:什么是 Eloquent Models?
主题:Laravel
难度:⭐⭐
Laravel 内置的 Eloquent ORM 提供了一个美观简洁的 ActiveRecord 实现,用于操作数据库。每个数据库表都有一个对应的模型 (Model),用于与该表交互。模型 (Model) 允许您查询表中的数据,以及向表中插入新记录。
🔗来源: laravel.com
Q7:什么是 Laravel 事件?
主题:Laravel
难度:⭐⭐
Laravel 事件提供了一个简单的观察者模式实现,允许在应用程序中订阅和监听事件。事件是指程序检测到并处理的事件或发生。
以下是 Laravel 中的一些事件示例:
- 已注册新用户
- 有新评论
- 用户登录/注销
- 添加了新产品。
🔗资料来源: mytectra.com
Q8:您对 Laravel 中的查询生成器了解多少?
主题:Laravel
难度:⭐⭐⭐
Laravel 的数据库查询构建器提供了一个便捷、流畅的界面来创建和运行数据库查询。它可用于执行应用程序中的大多数数据库操作,并且适用于所有支持的数据库系统。
Laravel 查询构建器使用 PDO 参数绑定来保护您的应用程序免受 SQL 注入攻击。无需清理作为绑定传递的字符串。
一些 QB 功能:
- 分块
- 聚合
- 选择
- 原始表达式
- 连接
- 工会
- 在哪里
- 排序、分组、限制和偏移
🔗来源: laravel.com
Q9:如何生成迁移?
主题:Laravel
难度:⭐⭐⭐
迁移就像数据库的版本控制,让您的团队可以轻松修改和共享应用程序的数据库架构。迁移通常与 Laravel 的架构构建器配合使用,以便轻松构建应用程序的数据库架构。
要创建迁移,请使用make:migration
Artisan 命令:
php artisan make:migration create_users_table
新的迁移文件将被放置在你的database/migrations
目录中。每个迁移文件名都包含一个时间戳,以便 Laravel 确定迁移文件的顺序。
🔗来源: laravel.com
Q10:如何模拟静态外观方法?
主题:Laravel
难度:⭐⭐⭐
Facades 为应用程序服务容器中可用的类提供了一个“静态”接口。与传统的静态方法调用不同,Facades可以被模拟。我们可以通过使用 方法来模拟对静态 Facade 方法的调用shouldReceive
,该方法将返回一个模拟的实例Mockery
。
// actual code
$value = Cache::get('key');
// testing
Cache::shouldReceive('get')
->once()
->with('key')
->andReturn('value');
🔗来源: laravel.com
Q11:预先加载有什么好处,什么时候使用它?
主题:Laravel
难度:⭐⭐⭐
当将 Eloquent 关系作为属性访问时,关系数据是“延迟加载”的。这意味着关系数据直到您第一次访问该属性时才会真正加载。但是,Eloquent 可以在您查询父模型时“预先加载”关系。
当我们有嵌套对象(例如书籍 -> 作者)时,预先加载可以缓解N + 1
查询问题。我们可以使用预先加载将此操作简化为仅 2 次查询。
🔗来源: FullStack.Cafe
Q12:如何进行软删除?
主题:Laravel
难度:⭐⭐⭐
作用域允许您轻松地在模型中复用查询逻辑。要定义作用域,只需在模型方法前添加 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();
有时你可能希望定义一个接受参数的作用域。动态作用域接受查询参数:
class User extends Model {
public function scopeOfType($query, $type)
{
return $query->whereType($type);
}
}
用法:
$users = User::ofType('member')->get();
🔗来源: laravel.com
Q13:Laravel 中的命名路线是什么?
主题:Laravel
难度:⭐⭐⭐
命名路由允许在生成重定向或 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
Q14:Laravel 中的闭包是什么?
主题:Laravel
难度:⭐⭐⭐
闭包是一个匿名函数。闭包通常用作回调方法,也可以作为函数中的参数。
function handle(Closure $closure) {
$closure('Hello World!');
}
handle(function($value){
echo $value;
});
🔗来源: stackoverflow.com
Q15:列出 Laravel 中的查询构建器提供的一些聚合方法?
主题:Laravel
难度:⭐⭐⭐
聚合函数是一种将多行的值按照一定的标准组合在一起作为输入的函数,以形成具有更重要意义或测量值的单个值,例如集合、包或列表。
以下是 Laravel 查询生成器提供的一些聚合方法的列表:
- 数数()
$products = DB::table(‘products’)->count();
- 最大限度()
$price = DB::table(‘orders’)->max(‘price’);
- min()
$price = DB::table(‘orders’)->min(‘price’);
- 平均值()
*$price = DB::table(‘orders’)->avg(‘price’);
- 和()
$price = DB::table(‘orders’)->sum(‘price’);
🔗来源: laravelinterviewquestions.com
Q16:Laravel 中的反向路由是什么?
主题:Laravel
难度:⭐⭐⭐
在 Laravel 中,反向路由是根据路由声明生成 URL 的。反向路由使你的应用程序更加灵活。例如,下面的路由声明告诉 Laravel,当请求的 URI 为“login”时,在用户控制器中执行“login”操作。
Route::get(‘login’, ‘users@login’);
使用反向路由,我们可以创建一个指向它的链接,并传入我们定义的任何参数。如果未提供可选参数,则会从生成的链接中删除。
{{ HTML::link_to_action('users@login') }}
它将在视图中创建一个类似http://mysite.com/login的链接。
🔗来源: stackoverflow.com
Q17:让我们为 PHP 创建枚举。请提供一些代码示例。
主题: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
Q18:PHP 中的自动加载类是什么?
主题: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
Q19: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
Q20:为什么我们需要 Laravel 中的 Traits?
主题:Laravel
难度:⭐⭐⭐⭐
PHP 添加Traits的原因很简单:PHP 不支持多重继承。简而言之,一个类不能同时继承多个类。当你需要在两个不同的类中声明功能,而这些功能又被其他类使用时,这会变得非常繁琐,最终导致你必须重复编写代码才能完成任务,避免陷入繁琐的程序代码中。
进入“特征”的世界。这些特征允许我们声明一个包含可重用方法的类。更棒的是,它们的方法可以直接注入到你使用的任何类中,并且你可以在同一个类中使用多个特征。让我们来看一个简单的 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
Q21:PHP 中的自动加载器是什么?
主题:Laravel
难度:⭐⭐⭐⭐
自动加载器定义了在代码中自动包含 PHP 类的方法,而无需使用像 require 和 include 这样的语句。
- PSR-4允许更简单的文件夹结构,但会阻止我们仅通过查看完全限定名称来了解类的确切路径。
- 另一方面,PSR-0在硬盘上比较混乱,但它支持那些停留在过去的开发人员(类名中使用下划线的用户),并帮助我们仅通过查看类的名称就能辨别出类的位置。
🔗资料来源: sitepoint.com
Q22:PHP 中的 yield 是什么意思?
主题: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()
返回 a ,generator
而返回b()
的只是一个简单的array
。您可以对两者进行迭代。
该函数的生成器版本无需分配完整的数组,因此内存需求较低。生成器可以用来解决内存限制问题。由于生成器仅按需计算其产生的值,因此它们非常适合用于表示那些计算成本高昂或无法一次性计算的序列。
🔗来源: stackoverflow.com
Q23:PHP 中的 $$$ 是什么意思?
主题: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://dev.to/fullstackcafe/23-laravel-interview-questions-answered-you-should-know-ibm感谢🙌的阅读,祝你面试顺利!
如果喜欢,请分享给你的开发者同事!
更多 FullStack 面试问答,请访问👉 www.fullstack.cafe