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中使用PDF文档功能
Oct 09 PHP
简单的移动设备检测PHP脚本代码
Feb 19 PHP
php fsockopen伪造post与get方法的详解
Jun 14 PHP
php foreach正序倒序输出示例代码
Jul 01 PHP
用 Composer构建自己的 PHP 框架之使用 ORM
Oct 30 PHP
利用“多说”制作留言板、评论系统
Jul 14 PHP
PHP下SSL加密解密、验证、签名方法(很简单)
Jun 28 PHP
thinkPHP连接sqlite3数据库的实现方法(附Thinkphp代码生成器下载)
May 27 PHP
php异步:在php中使用fsockopen curl实现类似异步处理的功能方法
Dec 10 PHP
php文件管理基本功能简单操作
Jan 16 PHP
PHP获取表单数据与HTML嵌入PHP脚本的实现
Feb 09 PHP
Laravel框架实现即点即改功能的方法分析
Oct 31 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
别人整理的服务器变量:$_SERVER
2006/10/20 PHP
php中数组首字符过滤功能代码
2012/07/31 PHP
CI框架开发新浪微博登录接口源码完整版
2014/05/28 PHP
PHP常用操作类之通信数据封装类的实现
2017/07/16 PHP
PHP实现微信对账单处理
2018/10/01 PHP
jQuery 剧场版 你必须知道的javascript
2009/05/27 Javascript
javascript实现带节日和农历的日历特效
2015/02/01 Javascript
Jquery easyui开启行编辑模式增删改操作
2016/01/14 Javascript
JavaScript数据类型学习笔记
2016/01/25 Javascript
jQuery实现的导航动画效果(附demo源码)
2016/04/01 Javascript
Bootstrap组件系列之福利篇几款好用的组件(推荐)
2016/06/23 Javascript
vue2项目使用sass的示例代码
2017/06/28 Javascript
ReactNative踩坑之配置调试端口的解决方法
2017/07/28 Javascript
js 倒计时(高效率服务器时间同步)
2017/09/12 Javascript
对于js垃圾回收机制的理解
2017/09/14 Javascript
在HTML文档中嵌入JavaScript的四种方法
2018/05/07 Javascript
Angular resolve基础用法详解
2018/10/03 Javascript
深入理解JavaScript 中的执行上下文和执行栈
2018/10/23 Javascript
小程序自定义日历效果
2018/12/29 Javascript
简单了解JavaScript中常见的反模式
2019/06/21 Javascript
Flutter实现仿微信底部菜单栏功能
2019/09/18 Javascript
使用Webpack 搭建 Vue3 开发环境过程详解
2020/07/28 Javascript
JavaScript如何操作css
2020/10/24 Javascript
python使用正则表达式分析网页中的图片并进行替换的方法
2015/03/26 Python
Python实现对PPT文件进行截图操作的方法
2015/04/28 Python
Python socket编程实例详解
2015/05/27 Python
python实现图书馆研习室自动预约功能
2018/04/27 Python
pytorch自定义初始化权重的方法
2019/08/17 Python
python实现获取单向链表倒数第k个结点的值示例
2019/10/24 Python
如何基于Python代码实现高精度免费OCR工具
2020/06/18 Python
新西兰最大的在线设计师眼镜店:SmartBuyGlasses新西兰
2017/10/20 全球购物
JAVA的事件委托机制和垃圾回收机制
2014/09/07 面试题
怎么样写好简历中的自我评价
2013/10/25 职场文书
前厅收银主管岗位职责
2014/02/04 职场文书
艺术学院毕业生求职信
2014/07/09 职场文书
2014年实习班主任工作总结
2014/11/08 职场文书