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 18 PHP
php使用curl模拟登录后采集页面的例子
Nov 04 PHP
ThinkPHP的Widget扩展实例
Jun 19 PHP
PHP获取表单所有复选框的值的方法
Aug 28 PHP
thinkphp判断访客为手机端或PC端的方法
Nov 24 PHP
ThinkPHP自动完成中使用函数与回调方法实例
Nov 29 PHP
php实现微信公众平台账号自定义菜单类
Oct 11 PHP
Yii中实现处理前后台登录的新方法
Dec 28 PHP
高质量PHP代码的50个实用技巧必备(下)
Jan 22 PHP
PHP多维数组指定多字段排序的示例代码
May 16 PHP
CI框架网页缓存简单用法分析
Dec 26 PHP
PHP删除字符串中非字母数字字符方法总结
Jan 20 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
Zend引擎的发展 [15]
2006/10/09 PHP
php 运行效率总结(提示程序速度)
2009/11/26 PHP
浅析PHP原理之变量(Variables inside PHP)
2013/08/09 PHP
php object转数组示例
2014/01/15 PHP
destoon会员注册提示“数据校验失败(2)”解决方法
2014/06/21 PHP
php获取本机真实IP地址实例代码
2016/03/31 PHP
PHP基于GD库实现的生成图片缩略图函数示例
2017/07/05 PHP
原生Ajax 和jQuery Ajax的区别示例分析
2014/12/17 Javascript
NodeJS的Promise的用法解析
2016/05/05 NodeJs
JS仿京东移动端手指拨动切换轮播图效果
2020/04/10 Javascript
Angular+Node生成随机数的方法
2017/06/16 Javascript
JS基于正则表达式实现的密码强度验证功能示例
2017/09/21 Javascript
nuxt+axios解决前后端分离SSR的示例代码
2017/10/24 Javascript
angularjs select 赋值 ng-options配置方法
2018/02/28 Javascript
5分钟学会Vue动画效果(小结)
2018/07/21 Javascript
微信开发之微信jssdk录音功能开发示例
2018/10/22 Javascript
微信小程序实现的picker多级联动功能示例
2019/05/23 Javascript
微信小程序实现订单倒计时
2020/11/01 Javascript
JavaScript this在函数中的指向及实例详解
2019/10/14 Javascript
javascript设计模式 ? 装饰模式原理与应用实例分析
2020/04/14 Javascript
[00:35]DOTA2上海特级锦标赛 Newbee战队宣传片
2016/03/03 DOTA
[01:04:14]OG vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
详解Python编程中对Monkey Patch猴子补丁开发方式的运用
2016/05/27 Python
Python竟能画这么漂亮的花,帅呆了(代码分享)
2017/11/15 Python
Tensorflow之构建自己的图片数据集TFrecords的方法
2018/02/07 Python
python绘制立方体的方法
2018/07/02 Python
使用python serial 获取所有的串口名称的实例
2019/07/02 Python
python利用openpyxl拆分多个工作表的工作簿的方法
2019/09/27 Python
使用python turtle画高达
2020/01/19 Python
给 TensorFlow 变量进行赋值的方式
2020/02/10 Python
Python Matplotlib简易教程(小白教程)
2020/07/28 Python
Scrapy基于scrapy_redis实现分布式爬虫部署的示例
2020/09/29 Python
利用python实现汉诺塔游戏
2021/03/01 Python
世界上最大的皮肤科医生拥有和经营的美容网站:LovelySkin
2021/01/03 全球购物
2014年最新个人对照检查材料范文
2014/09/25 职场文书
大三学生英语考试作弊检讨书
2015/01/01 职场文书