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教程孙仲岳主讲
Jan 07 PHP
php 攻击方法之谈php+mysql注射语句构造
Oct 30 PHP
Windows 下的 PHP-PEAR 安装方法
Nov 20 PHP
PHP爆绝对路径方法收集整理
Sep 17 PHP
PHP5.2中PDO的简单使用方法
Mar 25 PHP
PHP session 会话处理函数
Jun 06 PHP
Thinkphp整合微信支付功能
Dec 14 PHP
PHP正则表达式匹配替换与分割功能实例浅析
Feb 04 PHP
关于PHP定时发送服务的解决办法
Apr 23 PHP
PHP实现类似于C语言的文件读取及解析功能
Sep 01 PHP
PHP的简单跳转提示的实现详解
Mar 14 PHP
使用laravel根据用户类型来显示或隐藏字段
Oct 17 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数组函数序列之end() - 移动数组内部指针到最后一个元素,并返回该元素的值
2011/10/31 PHP
PHP简单遍历对象示例
2016/09/28 PHP
PHP多种序列化/反序列化的方法详解
2017/06/23 PHP
一段利用WSH获取登录时间的jscript代码
2008/05/11 Javascript
Javascript 文件夹选择框的两种解决方案
2009/07/01 Javascript
小议javascript 设计模式 推荐
2009/10/28 Javascript
33个优秀的jQuery 教程分享(幻灯片、动画菜单)
2011/07/08 Javascript
jQuery+JSON+jPlayer实现QQ空间音乐查询功能示例
2013/06/17 Javascript
JavaScript解析json格式数据简单示例
2014/12/09 Javascript
js日期插件dateHelp获取本月、三个月、今年的日期
2016/03/07 Javascript
JS图片定时翻滚效果实现方法
2016/06/21 Javascript
RequireJS多页面应用实例分析
2016/06/29 Javascript
JS实现的表头列头固定页面功能示例
2017/01/10 Javascript
vue2.0+ 从插件开发到npm发布的示例代码
2018/04/28 Javascript
详解React 服务端渲染方案完美的解决方案
2018/12/14 Javascript
9102了,你还不会移动端真机调试吗
2019/03/25 Javascript
微信域名检测接口调用演示步骤(含PHP、Python)
2019/12/08 Javascript
Vue文本模糊匹配功能如何实现
2020/07/30 Javascript
nodejs+koa2 实现模仿springMVC框架
2020/10/21 NodeJs
ant design pro中可控的筛选和排序实例
2020/11/17 Javascript
python 怎样将dataframe中的字符串日期转化为日期的方法
2019/09/26 Python
python 浅谈serial与stm32通信的编码问题
2019/12/18 Python
Python使用PyQt5/PySide2编写一个极简的音乐播放器功能
2020/02/07 Python
pycharm新建Vue项目的方法步骤(图文)
2020/03/04 Python
python读取当前目录下的CSV文件数据
2020/03/11 Python
Crocs卡骆驰洞洞鞋日本官方网站:Crocs日本
2016/08/25 全球购物
Timberland俄罗斯官方网上商店:全球领先的户外品牌
2020/03/15 全球购物
意大利和国际奢侈品牌购物网站:Suitnegozi.com
2021/01/15 全球购物
什么是Smarty变量操作符?如何使用Smarty变量操作符
2014/07/18 面试题
国贸专业的职业规划范文
2014/01/23 职场文书
新农村建设汇报材料
2014/08/15 职场文书
绍兴鲁迅故居导游词
2015/02/09 职场文书
个人简历求职信范文
2015/03/20 职场文书
堂吉诃德读书笔记
2015/06/30 职场文书
2016大学生诚信考试承诺书
2016/03/25 职场文书
农村房屋租赁合同(范本)
2019/07/23 职场文书