zoukankan      html  css  js  c++  java
  • 【PHP】23 个你应该知道的 Laravel 面试问题

    探索下一次技术面试之前应该了解的前20个 Laravel 面试问题。

    Q1:什么是Laravel?

    主题: Laravel
    难度: ⭐

    Laravel 是一个免费的开放源代码 PHP Web 框架,由 Taylor Otwell 创建,旨在遵循模型-视图-控制器(MVC)架构模式开发 Web 应用程序。

    Q2: Laravel 与其他 Php 框架相比有哪些好处?

    主题: Laravel
    难度: ⭐

    • 与其他框架相比,设置和自定义过程既简单又快速。

    • 内置认证系统

    • 支持多个文件系统

    • 预装软件包,例如 Laravel Socialite,Laravel cashier,Laravel elixir,Passport,Laravel Scout

    • PHP active record 实现的 Eloquent ORM (对象关系映射)

    • 内置命令行工具 “Artisan”,用于创建代码框架,数据库结构并构建其迁移

    Q3:解释 Laravel 中的迁移

    主题: Laravel
    难度: ⭐⭐

    Laravel Migrations 类似于数据库的版本控制,使团队可以轻松地修改和共享应用程序的数据库架构。迁移通常与 Laravel 的架构生成器搭配使用,以轻松构建应用程序的数据库架构。

    Q4:Facade Pattern 有什么用?

    主题: Laravel
    难度: ⭐⭐

    Facades 为应用程序的服务容器中可用的类提供了一个 静态 接口。Laravel facades 作为服务容器中基础类的静态代理,提供了简洁、表达性强的语法的优势,同时保持了比传统静态方法更高的可测试性和灵活性。

    所有的 Laravel facades 都是在 IlluminateSupportFacades 命名空间中定义。

    查看:

    use IlluminateSupportFacadesCache;
    
    Route::get('/cache', function () {
        return Cache::get('key');
    });
    

    Q5:什么是服务容器?

    主题: Laravel
    难度: ⭐⭐

    Laravel 服务容器 是用于管理类依赖性和执行依赖性注入的工具。

    Q6:什么是 Eloquent Models?

    主题: Laravel
    难度: ⭐⭐

    Laravel 附带的 Eloquent ORM 提供了一个漂亮、简单的 ActiveRecord 实现,用于处理数据库。每个数据库表都有一个对应的模型,用于与该表进行交互。通过模型,您可以查询表中的数据,以及将新记录插入表中。

    Q7:什么是Laravel事件?

    主题: Laravel
    难度: ⭐⭐

    Laravel 事件提供了一个简单的观察者模式实现,允许订阅和监听应用程序中的事件。事件是程序检测并处理的事故或事情。

    以下是 Laravel 中的一些事件示例:

    • 新用户注册

    • 发布新评论

    • 用户登录/注销

    • 添加了新产品。

    Q8:你对 Laravel 中的查询生成器了解多少?

    主题: Laravel
    难度: ⭐⭐⭐

    Laravel 的数据库查询构建器为创建和运行数据库查询提供了方便,流畅的接口。它可以用于在应用程序中执行大多数数据库操作,并且可以在所有支持的数据库系统上工作。

    Laravel 查询构建器使用 PDO 参数绑定来保护应用程序免受 SQL 注入攻击。无需清除作为绑定传递的字符串。

    查询生成器的一些功能:

    • 分块

    • 聚合

    • Selects

    • 原生方法

    • Joins

    • Unions

    • Where 语句

    • Ordering,Grouping,Limit,& Offset

    Q9:如何生成迁移?

    主题: Laravel
    难度: ⭐⭐⭐

    迁移就像您数据库的版本控制一样,使您的团队可以轻松地修改和共享应用程序的数据库架构。迁移通常与 Laravel 的架构构建器搭配使用,以轻松构建应用程序的数据库架构。

    要创建迁移,使用 make:migration Artisan 命令:

    php artisan make:migration create_users_table
    

    新的迁移将放置在您的 database/migrations 目录中。每个迁移文件名都包含一个时间戳,该时间戳使 Laravel 可以确定迁移的顺序。

    Q10:如何 mock 一个静态 facade 方法?

    主题:Laravel
    难度:⭐⭐⭐

    Facades 为应用程序的服务容器中可用的类提供“静态”接口。与传统的静态方法调用不同,Facades 是可被 mock 的。我们可以使用 shouldReceive 方法 mock 对静态外观方法的调用,该方法将返回 Mockery mock 的实例。

    // 实际代码
    $value = Cache::get('key');
    
    // 测试
    Cache::shouldReceive('get')
                        ->once()
                        ->with('key')
                        ->andReturn('value');
    

    Q11:Eager Loading 有什么好处,何时使用?

    主题: Laravel
    难度: ⭐⭐⭐

    当访问 Eloquent 关系作为属性时,关系数据是 “Lazy Loaded” 的。这意味着直到您首次访问该属性,关系数据才被实际加载。但是,Eloquent 可以在查询父模型时 “Eager Load” 关系。

    当我们有嵌套对象时(例如书本->作者),Eager Loading 减轻了 N + 1 查询的问题。我们可以使用 Eager Loading 将此操作减少为仅2个查询。

    Q12:本地作用域有何用?

    主题: 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();
    

    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');
    

    Q14:Laravel中的闭包是什么?

    主题:Laravel
    难度:⭐⭐⭐

    闭包是一个匿名函数。闭包通常用作回调方法,并且可以用作函数中的参数

    function handle(Closure $closure) {
        $closure('Hello World!');
    }
    
    handle(function($value){
        echo $value;
    });
    

    Q15:列出 Laravel 中查询构建器提供的一些聚合方法?

    主题: Laravel
    难度: ⭐⭐⭐

    聚合函数是一种功能,能够将多行的值组合在一起,作为某些条件下的输入,以形成具有更重要含义或度量值(例如集合,包或列表)的单个值。

    以下是 Laravel 查询构建器提供的一些聚合方法的列表:

    • count()
    $products = DB::table(‘products’)->count();
    
    • max()
    $price = DB::table(‘orders’)->max(‘price’);
    
    • min()
    $price = DB::table(‘orders’)->min(‘price’);
    
    • avg()
    *$price = DB::table(‘orders’)->avg(‘price’);
    
    • sum()
     $price = DB::table(‘orders’)->sum(‘price’);
    

    Q16:什么是 Laravel 中的反向路由?

    主题:Laravel
    难度:⭐⭐⭐

    在 Laravel 中,反向路由会根据路由声明生成 URL。反向路由使您的应用程序更加灵活。例如,下面的路由声明告诉 Laravel 当请求的 URI 为 “login” 时在 users 控制器中执行 “login” 操作。

    http://mysite.com/login

    Route::get(‘login’, ‘users@login’);
    

    使用反向路由,我们可以创建到它的链接并传递我们定义的任何参数。如果未提供可选参数,则会从生成的链接中删除。

    {{ HTML::link_to_action('users@login') }}
    

    它将在视图中创建类似 http://mysite.com/login 的链接。

    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
    

    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。

    Q19:PHP是否支持方法重载?

    主题:PHP
    难度:⭐⭐⭐

    方法重载是使用具有不同签名的相同方法名称的现象。PHP 中函数签名仅基于它们的名称,并且不包含参数列表,因此不能有两个具有相同名称的函数,所以 PHP 不支持方法重载。

    但是,您可以声明一个可变函数,它接受可变数量的参数。您可以使用 func_num_args() 和 func_get_arg() 来传递参数并正常使用它们。

    function myFunc() {
        for ($i = 0; $i < func_num_args(); $i++) {
            printf("Argument %d: %s
    ", $i, func_get_arg($i));
        }
    }
    
    /*
    Argument 0: a
    Argument 1: 2
    Argument 2: 3.5
    */
    myFunc('a', 2, 3.5);
    

    Q20:Laravel 中为什么需要 Traits?

    主题: 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";
    

    Q21:PHP 中的 Autoloader 是什么?

    主题: Laravel
    难度: ⭐⭐⭐⭐

    自动加载器定义了自动在代码中包含 PHP 类的方法,而不必使用诸如 require 和 include 之类的语句。

    PSR-4 将支持更简单的文件夹结构,但是将使我们仅通过查看完全限定的名称就无法知道类的确切路径。

    PSR-0 在硬盘驱动器上比较混乱,但是支持念旧的开发人员(类名下划线用户),并帮助我们通过以下方式辨别类的位置:看它的名字。

    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() 返回一个 generator,而 b() 只是一个简单的 数组。而且两者都可以被迭代。

    函数的生成器版本未分配完整的数组,因此对内存的需求较少。生成器可用于解决内存限制。由于生成器仅按需计算其 yielded 值,因此它们用于代替计算成本昂贵或无法一次性计算的序列很有用。

    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
    

    点关注,不迷路

    好了各位,以上就是程序员会在面试过程中碰到的问题,能看到这里的人呀,都是人才。如果你经常参加面试的话,就会发现以上面试题很熟悉。所谓“知己知彼,百战不殆”,充实自身技能,才能顺利进面。之前说过,PHP方面的技术点很多,也是因为太多了,实在是写不过来,写过来了大家也不会看的太多,所以我这里把它整理成了PDF和文档,如果有需要的可以

    点击进入暗号: PHP+「平台」

    在这里插入图片描述

    在这里插入图片描述


    更多学习内容可以访问【对标大厂】精品PHP架构师教程目录大全,只要你能看完保证薪资上升一个台阶(持续更新)

    以上内容希望帮助到大家,很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家,需要的可以加入我的 PHP技术交流群

  • 相关阅读:
    23.C++- 继承的多种方式、显示调用父类构造函数、父子之间的同名函数、virtual虚函数
    22.C++- 继承与组合,protected访问级别
    LeetCode-391. 完美矩形(使用C语言编译,详解)
    LeetCode-101.对称二叉树
    STM32-对芯片启动读保护,实现加密(详解)
    21.C++- "++"操作符重载、隐式转换之explicit关键字、类的类型转换函数
    20.C++- "&&","||"逻辑重载操作符的缺陷、","逗号重载操作符的分析
    19.C++-(=)赋值操作符、初步编写智能指针
    18.C++-[ ]操作符使用 、函数对象与普通函数区别(详解)
    ECMAScript 6.0基础入门教程
  • 原文地址:https://www.cnblogs.com/it-abu/p/14213615.html
Copyright © 2011-2022 走看看