php自动加载代码实例详解


Posted in PHP onFebruary 26, 2021

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自动加载代码实例详解的文章就介绍到这了,更多相关php自动加载内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

PHP 相关文章推荐
PHP系统流量分析的程序
Oct 09 PHP
php 生成WML页面方法详解
Aug 09 PHP
解决file_get_contents无法请求https连接的方法
Dec 17 PHP
PHP的preg_match匹配字符串长度问题解决方法
May 03 PHP
基于递归实现的php树形菜单代码
Nov 19 PHP
php的4种常见运行方式
Mar 20 PHP
php生成rss类用法实例
Apr 14 PHP
thinkphp项目部署到Linux服务器上报错“模板不存在”如何解决
Apr 27 PHP
php实现留言板功能(会话控制)
May 23 PHP
php微信开发之关键词回复功能
Jun 13 PHP
php实现微信分享朋友链接功能
Feb 18 PHP
php7性能提升的原因详解
Oct 13 PHP
PHP的重载使用魔术方法代码实例详解
Feb 26 #PHP
PHP解密支付宝小程序的加密数据、手机号的示例代码
Feb 26 #PHP
php中get_object_vars()在数组的实例用法
Feb 22 #PHP
MacOS下PHP7.1升级到PHP7.4.15的方法
Feb 22 #PHP
关于PhpStorm设置点击编辑文件自动定位源文件的实现方式
Dec 30 #PHP
Thinkphp5+Redis实现商品秒杀代码实例讲解
Dec 29 #PHP
PHP序列化和反序列化深度剖析实例讲解
Dec 29 #PHP
You might like
php强制下载类型的实现代码
2011/04/21 PHP
PHP GD库生成图像的几个函数总结
2014/11/19 PHP
yiic命令时提示“php.exe”不是内部或外部命令的解决方法
2014/12/18 PHP
PHP操作MySQL中BLOB字段的方法示例【存储文本与图片】
2017/09/15 PHP
thinkPHP框架自动填充原理与用法分析
2018/04/03 PHP
详解JavaScript中常用的函数类型
2015/11/18 Javascript
谈谈javascript中使用连等赋值操作带来的问题
2015/11/26 Javascript
Three.js学习之几何形状
2016/08/01 Javascript
整理关于Bootstrap表单的慕课笔记
2017/03/29 Javascript
nodejs个人博客开发第六步 数据分页
2017/04/12 NodeJs
详解前后端分离之VueJS前端
2017/05/24 Javascript
apicloud拉起小程序并传递参数的方法示例
2018/11/21 Javascript
微信小程序mpvue点击按钮获取button值的方法
2019/05/29 Javascript
基于aotu.js实现微信自动添加通讯录中的联系人功能
2020/05/28 Javascript
element-ui中dialog弹窗关闭按钮失效的解决
2020/09/22 Javascript
基于vue与element实现创建试卷相关功能(实例代码)
2020/12/07 Vue.js
详解如何在vue+element-ui的项目中封装dialog组件
2020/12/11 Vue.js
[01:04:09]DOTA2-DPC中国联赛 正赛 iG vs VG BO3 第二场 2月2日
2021/03/11 DOTA
python基础教程之python消息摘要算法使用示例
2014/02/10 Python
Python实现的批量下载RFC文档
2015/03/10 Python
Python理解递归的方法总结
2019/01/28 Python
Python创建数字列表的示例
2019/11/28 Python
python3 使用traceback定位异常实例
2020/03/09 Python
python实现吃苹果小游戏
2020/03/21 Python
python脚本定时发送邮件
2020/12/22 Python
css3中less实现文字长阴影(long shadow)
2020/04/24 HTML / CSS
Darphin迪梵官网: 来自巴黎,植物和精油调制的护肤品牌
2016/10/11 全球购物
便利店的创业计划书
2014/01/15 职场文书
暑期培训班策划方案
2014/08/26 职场文书
2014年机关作风建设工作总结
2014/10/23 职场文书
百年孤独读书笔记
2015/06/29 职场文书
行政处罚告知书
2015/07/01 职场文书
国家助学金受助感言
2015/08/01 职场文书
JavaWeb Servlet实现网页登录功能
2021/07/04 Java/Android
PostgreSQL出现死锁该如何解决
2022/05/30 PostgreSQL
Redis实现主从复制方式(Master&Slave)
2022/06/21 Redis