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 相关文章推荐
在PWS上安装PHP4.0正式版
Oct 09 PHP
php+AJAX传送中文会导致乱码的问题的解决方法
Sep 08 PHP
php 启动报错如何解决
Jan 17 PHP
thinkphp实现图片上传功能分享
Mar 04 PHP
ThinkPHP模板判断输出Empty标签用法详解
Jun 30 PHP
PHP中substr()与explode()函数用法分析
Nov 24 PHP
php计算指定目录下文件占用空间的方法
Mar 13 PHP
PHP中static关键字以及与self关键字的区别
Jul 01 PHP
通过PHP自带的服务器来查看正则匹配结果的方法
Dec 24 PHP
PHP的邮件群发系统phplist配置方法详细总结
Mar 30 PHP
PHP cURL获取微信公众号access_token的实例
Apr 28 PHP
php支付宝系列之电脑网站支付
May 30 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采集文章中的图片获取替换到本地(实现代码)
2013/07/08 PHP
zf框架的registry(注册表)使用示例
2014/03/13 PHP
PHP中使用数组指针函数操作数组示例
2014/11/19 PHP
Yii隐藏URL中index.php的方法
2016/07/12 PHP
微信 getAccessToken方法详解及实例
2016/11/23 PHP
PHP简单实现图片格式转换(jpg转png,gif转png等)
2019/10/30 PHP
漂亮的widgets,支持换肤和后期开发新皮肤
2007/04/23 Javascript
很多人都是用下面的js刷新站IP和PV
2008/09/05 Javascript
基于jQuery的合并表格中相同文本的相邻单元格的代码
2011/04/06 Javascript
html+js实现动态显示本地时间
2013/09/21 Javascript
使用正则表达式的格式化与高亮显示json字符串
2014/12/03 Javascript
DOM节点的替换或修改函数replaceChild()用法实例
2015/01/12 Javascript
AngularJS基础学习笔记之简单介绍
2015/05/10 Javascript
JS不完全国际化&amp;本地化手册 之 理论篇
2016/09/27 Javascript
Vue实现选择城市功能
2017/05/27 Javascript
十大 Node.js 的 Web 框架(快速提升工作效率)
2017/06/30 Javascript
angular中ui calendar的一些使用心得(推荐)
2017/11/03 Javascript
详解PHP后期静态绑定分析与应用
2018/03/21 Javascript
Node.js 使用AngularJS的方法示例
2018/05/11 Javascript
AJAX在JQuery中的应用详解
2019/01/30 jQuery
JavaScript创建表格的方法
2020/04/13 Javascript
js cavans实现静态滚动弹幕
2020/05/21 Javascript
基于Vue全局组件与局部组件的区别说明
2020/08/11 Javascript
Python实现简单的可逆加密程序实例
2015/03/05 Python
Python自定义线程池实现方法分析
2018/02/07 Python
Python实现读写INI配置文件的方法示例
2018/06/09 Python
Python2和Python3的共存和切换使用
2019/04/12 Python
Python 发送邮件方法总结
2020/08/10 Python
Python 利用argparse模块实现脚本命令行参数解析
2020/12/28 Python
Html5实现如何在两个div元素之间拖放图像
2013/03/29 HTML / CSS
授权委托书格式模板
2014/04/03 职场文书
开服装店计划书
2014/08/15 职场文书
医院护士见习期自我鉴定
2014/09/15 职场文书
新人入职感言
2015/07/31 职场文书
Go语言使用select{}阻塞main函数介绍
2021/04/25 Golang
Apache Pulsar集群搭建部署详细过程
2022/02/12 Servers