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小程序自动提交到自助友情连接
Nov 24 PHP
PHP设计模式之责任链模式的深入解析
Jun 13 PHP
destoon二次开发入门示例
Jun 20 PHP
ThinkPHP中pathinfo的访问模式、路径访问模式及URL重写总结
Aug 23 PHP
Zend Guard使用指南及问题处理
Jan 07 PHP
PHP针对JSON操作实例分析
Jan 12 PHP
PHP网络操作函数汇总
May 18 PHP
php比较相似字符串的方法
Jun 05 PHP
ThinkPHP中create()方法自动验证表单信息
Apr 28 PHP
PHP程序员学习使用Swoole的理由
Jun 24 PHP
PHP使用 Pear 进行安装和卸载包的方法详解
Jul 08 PHP
PHP tp5中使用原生sql查询代码实例
Oct 28 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
一拳超人中怪人协会钦定! S级别最强四人!
2020/03/02 日漫
PHP中的加密功能
2006/10/09 PHP
phpMyAdmin 安装配置方法和问题解决
2009/06/08 PHP
Ajax+PHP 边学边练 之二 实例
2009/11/24 PHP
用php实现的下载css文件中的图片的代码
2010/02/08 PHP
php基础教程 php内置函数实例教程
2012/08/21 PHP
解决php使用异步调用获取数据时出现(错误c00ce56e导致此项操作无法完成)
2013/07/03 PHP
php遍历目录下文件并按修改时间排序操作示例
2019/07/12 PHP
JQuery textlimit 显示用户输入的字符数 限制用户输入的字符数
2009/05/14 Javascript
jQuery 性能优化指南 (1)
2009/05/21 Javascript
jquery CSS选择器笔记
2010/03/29 Javascript
当鼠标移动到图片上时跟随鼠标显示放大的图片效果
2013/06/06 Javascript
javascript实例分享---具有立体效果的图片特效
2014/06/08 Javascript
使用js dom和jquery分别实现简单增删改
2014/09/11 Javascript
Javascript 闭包详解及实例代码
2016/11/30 Javascript
用JS实现简单的登录验证功能
2017/07/28 Javascript
关于jquery form表单序列化的注意事项详解
2017/08/01 jQuery
微信小程序修改swiper默认指示器样式的实例代码
2018/07/18 Javascript
使用JS获取页面上的所有标签
2018/10/18 Javascript
微信小程序之事件交互操作实例分析
2018/12/03 Javascript
Node.js系列之发起get/post请求(2)
2019/08/30 Javascript
package.json中homepage属性的作用详解
2020/03/11 Javascript
jquery绑定事件 bind和on的用法与区别分析
2020/05/22 jQuery
Python常用内置函数总结
2015/02/08 Python
Python图像滤波处理操作示例【基于ImageFilter类】
2019/01/03 Python
在Python中将函数作为另一个函数的参数传入并调用的方法
2019/01/22 Python
如何利用Anaconda配置简单的Python环境
2019/06/24 Python
django执行数据库查询之后实现返回的结果集转json
2020/03/31 Python
Python中过滤字符串列表的方法
2020/12/22 Python
HTML5 video视频字幕的使用和制作方法
2018/05/03 HTML / CSS
ManoMano英国:欧洲第一家专注于DIY和园艺市场的电商平台
2020/03/12 全球购物
普通简短的个人自我评价
2014/02/15 职场文书
国际经济与贸易专业求职信
2014/07/10 职场文书
自愿离婚协议书范本
2014/09/13 职场文书
python 使用Tensorflow训练BP神经网络实现鸢尾花分类
2021/05/12 Python
Ruby使用Mysql2连接操作MySQL
2022/04/19 Ruby