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字符串处理的10个简单方法
Jun 30 PHP
用穿越火线快速入门php面向对象
Feb 22 PHP
奇怪的PHP引用效率问题分析
Mar 23 PHP
解析php中的escape函数
Jun 29 PHP
Laravel 4 初级教程之安装及入门
Oct 30 PHP
php多个文件及图片上传实例详解
Nov 10 PHP
PHP中的类型提示(type hinting)功能介绍
Jul 01 PHP
Zend Framework创建自己的动作助手详解
Mar 05 PHP
php实现搜索类封装示例
Mar 31 PHP
php获取远程图片并下载保存到本地的方法分析
Oct 08 PHP
PHP定时任务获取微信access_token的方法
Oct 10 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
轻松入门: 煮好咖啡的七个诀窍
2021/03/03 冲泡冲煮
PHP 和 MySQL 基础教程(二)
2006/10/09 PHP
php正则修正符用法实例详解
2016/12/29 PHP
PHP设计模式(五)适配器模式Adapter实例详解【结构型】
2020/05/02 PHP
csdn 论坛技术区平均给分功能
2009/11/07 Javascript
jquery 多行滚动代码(附详细解释)
2010/06/17 Javascript
网络之美 JavaScript中Get和Set访问器的实现代码
2010/09/19 Javascript
最简单的js图片切换效果实现代码
2011/09/24 Javascript
解决js下referer兼容各大浏览器的方法
2014/11/03 Javascript
jQuery对象与DOM对象转换方法详解
2016/05/10 Javascript
smartupload实现文件上传时获取表单数据(推荐)
2016/12/12 Javascript
Bootstrap实现的标签页内容切换显示效果示例
2017/05/25 Javascript
详解从react转职到vue开发的项目准备
2019/01/14 Javascript
微信小程序如何实现精确的日期时间选择器
2020/01/21 Javascript
JavaScript实现简单进度条效果
2020/03/25 Javascript
Python入门篇之字典
2014/10/17 Python
基于Python实现对PDF文件的OCR识别
2016/08/05 Python
python使用pygame框架实现推箱子游戏
2018/11/20 Python
python-itchat 获取微信群用户信息的实例
2019/02/21 Python
Django之路由层的实现
2019/09/09 Python
Python如何使用字符打印照片
2020/01/03 Python
海外淘书首选:AbeBooks
2017/07/31 全球购物
Stührling手表官方网站:男女高品质时尚手表的领先零售商
2021/01/07 全球购物
大学毕业生通用自荐信范文
2013/10/31 职场文书
2014年三八妇女节活动方案
2014/02/28 职场文书
现金出纳岗位职责
2014/03/15 职场文书
环保建议书400字
2014/05/14 职场文书
中专毕业生的自荐书
2014/07/01 职场文书
2014年学校领导班子对照检查材料
2014/09/19 职场文书
生活小常识广播稿
2015/08/19 职场文书
小学英语教师研修感悟
2015/11/18 职场文书
大学生社区义工服务心得体会
2016/01/22 职场文书
彻底理解golang中什么是nil
2021/04/29 Golang
判断Python中的Nonetype类型
2021/05/25 Python
Redis中缓存穿透/击穿/雪崩问题和解决方法
2021/12/04 Redis
tomcat默认最大连接数及相关调整方法
2022/05/06 Servers