美文网首页PHP
laravel 基础面试题—php--自动加载

laravel 基础面试题—php--自动加载

作者: it阿布 | 来源:发表于2021-01-05 13:51 被阅读0次

    1. 让我们为 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
    

    2. 什么是 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。

    3. 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);
    

    问答:不是有 __ autoload 吗 为什么不用?

    自动加载的原理以及__autoload 的使用:

    自动加载的原理,就是在我们 new 一个 class 的时候,PHP 系统如果找不到你这个类,就会去自动调用本文件中的__autoload ($class_name) 方法,我们 new 的这个 class_name 就成为这个方法的参数。所以我们就可以在这个方法中根据我们需要 new class_name 的各种判断和划分就去 require 对应的路径类文件,从而实现自动加载。

    spl_autoload_register 的使用:

    如果一个项目过大,或者需要不同的自动加载来加载不同路径的文件,这个时候 autoload 就不好用了,

    原因是一个项目中只能有一个这样的 autoload () 函数,因为 PHP 不允许函数重名,

    也就是说你不能声明 2 个__autoload () 函数文件,否则会报致命错误,

    所以,可以用新的 spl_autoload_register () 来取代它。并且,它执行效率更高,更灵活。

    思考 1:laravel 中是如何实现自动加载的?

    点关注,不迷路

    好了各位,以上就是这篇文章的全部内容了,能看到这里的人呀,都是人才。之前说过,PHP方面的技术点很多,也是因为太多了,实在是写不过来,写过来了大家也不会看的太多,所以我这里把它整理成了PDF和文档,如果有需要的可以

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

    在这里插入图片描述 在这里插入图片描述

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

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

    相关文章

      网友评论

        本文标题:laravel 基础面试题—php--自动加载

        本文链接:https://www.haomeiwen.com/subject/ghoioktx.html