飞道的博客

php自动加载的一些详解

299人阅读  评论(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 () 来取代它。并且,它执行效率更高,更灵活。

以上内容希望帮助到大家,更多PHP大厂PDF,PHP进阶架构视频资料,PHP精彩好文可以微信搜索关注:PHP开源社区

2021金三银四大厂面试真题集锦,必看!

四年精华PHP技术文章整理合集——PHP框架篇

四年精华PHP技术文合集——微服务架构篇

四年精华PHP技术文合集——分布式架构篇

四年精华PHP技术文合集——高并发场景篇

四年精华PHP技术文章整理合集——数据库篇


转载:https://blog.csdn.net/liuxingjiaoyuC/article/details/114063076
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场