当前位置:首页 > PHP教程 > php高级应用 > 列表

php自动加载代码实例详解

发布:smiling 来源: PHP粉丝网  添加日期:2022-04-13 10:32:23 浏览: 评论:0 

这篇文章主要介绍了php自动加载代码实例详解,文中代码讲解的很清晰,有感兴趣的同学可以研究下。

1. 让我们为 PHP 创建枚举,提供一些代码示例

如果我们的代码需要对枚举常量和值进行更多验证,该怎么办?

根据使用情况,我通常会使用类似以下的简单内容:

  1. abstract class DaysOfWeek 
  2.   const Sunday = 0; 
  3.   const Monday = 1; 
  4.   // etc. 
  5.  
  6. $today = DaysOfWeek::Sunday; 

这是一个扩展的示例,可以更好地服务于更广泛的案例:

  1. abstract class BasicEnum { 
  2.   private static $constCacheArray = NULL; 
  3.  
  4.   private static function getConstants() { 
  5.     if (self::$constCacheArray == NULL) { 
  6.       self::$constCacheArray = []; 
  7.     } 
  8.     $calledClass = get_called_class(); 
  9.     if (!array_key_exists($calledClass, self::$constCacheArray)) { 
  10.       $reflect = new ReflectionClass($calledClass); 
  11.       self::$constCacheArray[$calledClass] = $reflect - > getConstants(); 
  12.     } 
  13.     return self::$constCacheArray[$calledClass]; 
  14.   } 
  15.  
  16.   public static function isValidName($name$strict = false) { 
  17.     $constants = self::getConstants(); 
  18.  
  19.     if ($strict) { 
  20.       return array_key_exists($name$constants); 
  21.     } 
  22.  
  23.     $keys = array_map('strtolower'array_keys($constants)); 
  24.     return in_array(strtolower($name), $keys); 
  25.   } 
  26.  
  27.   public static function isValidValue($value$strict = true) { 
  28.     $values = array_values(self::getConstants()); 
  29.     return in_array($value$values$strict); 
  30.   } 

我们可以将其用作:

  1. abstract class DaysOfWeek extends BasicEnum { 
  2.   const Sunday = 0; 
  3.   const Monday = 1; 
  4.   const Tuesday = 2; 
  5.   const Wednesday = 3; 
  6.   const Thursday = 4; 
  7.   const Friday = 5; 
  8.   const Saturday = 6; 
  9.  
  10. DaysOfWeek::isValidName('Humpday');         // false 
  11. DaysOfWeek::isValidName('Monday');          // true 
  12. DaysOfWeek::isValidName('monday');          // true 
  13. DaysOfWeek::isValidName('monday'$strict = true);  // false 
  14. DaysOfWeek::isValidName(0);             // false 
  15.  
  16. DaysOfWeek::isValidValue(0);             // true 
  17. DaysOfWeek::isValidValue(5);             // true 
  18. DaysOfWeek::isValidValue(7);             // false 
  19. DaysOfWeek::isValidValue('Friday');         // false 

2. 什么是 PHP 自动加载类?

使用自动加载器,PHP 允许在由于错误而失败之前最后一次加载类或接口。

PHP 中的 spl_autoload_register() 函数可以注册任意数量的自动加载器,即使未定义类和接口也可以自动加载。

  1. spl_autoload_register(function ($classname) { 
  2.   include $classname . '.php'
  3. }); 
  4. $object = new Class1(); 
  5. $object2 = new Class2(); 

在上面的示例中,我们不需要包含 Class1.php 和 Class2.php。spl_autoload_register() 函数将自动加载 Class1.php 和 Class2.php。

3. PHP 是否支持方法重载?

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

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

  1. function myFunc() { 
  2.   for ($i = 0; $i < func_num_args(); $i++) { 
  3.     printf("Argument %d: %s\n"$i, func_get_arg($i)); 
  4.   } 
  5.  
  6. /* 
  7. Argument 0: a 
  8. Argument 1: 2 
  9. Argument 2: 3.5 
  10. */ 
  11. 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 () 来取代它。并且,它执行效率更高,更灵活。

Tags: php自动加载

分享到: