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 获取mysql数据库信息代码
Mar 12 PHP
PHP is_dir() 判断给定文件名是否是一个目录
May 10 PHP
PHP将XML转数组过程详解
Nov 13 PHP
jQuery中的RadioButton,input,CheckBox取值赋值实现代码
Feb 18 PHP
在Yii框架中使用PHP模板引擎Twig的例子
Jun 13 PHP
php操作redis缓存方法分享
Jun 03 PHP
CodeIgniter控制器之业务逻辑实例分析
Jan 20 PHP
一波PHP中cURL库的常见用法代码示例
May 06 PHP
zen cart实现订单中增加paypal中预留电话的方法
Jul 12 PHP
PHP输出多个元素的排列或组合的方法
Mar 14 PHP
PHP+Session防止表单重复提交的解决方法
Apr 09 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 不同编码下的字符串长度区分
2009/09/26 PHP
解析php curl_setopt 函数的相关应用及介绍
2013/06/17 PHP
跟我学Laravel之配置Laravel
2014/10/15 PHP
php实现通过cookie换肤的方法
2015/07/13 PHP
如何实现php图片等比例缩放
2015/07/28 PHP
详解WordPress开发中get_header()获取头部函数的用法
2016/01/08 PHP
PHP创建文件及写入数据(覆盖写入,追加写入)的方法详解
2019/02/15 PHP
PHP配合fiddler抓包抓取微信指数小程序数据的实现方法分析
2020/01/02 PHP
PHP中isset、empty的用法与区别示例详解
2020/11/05 PHP
开发中可能会用到的jQuery小技巧
2014/03/07 Javascript
Jquery使用val方法读写value值
2015/05/18 Javascript
jQuery插件form-validation-engine正则表达式操作示例
2017/02/09 Javascript
Bootstrap面板(Panels)的简单实现代码
2017/03/17 Javascript
Vue.js实现在下拉列表区域外点击即可关闭下拉列表的功能(自定义下拉列表)
2017/05/30 Javascript
微信小程序实现渐入渐出动画效果
2019/06/13 Javascript
解决jquery validate 验证不通过后验证正确的信息仍残留在label上的方法
2019/08/27 jQuery
jQuery轮播图功能制作方法详解
2019/12/03 jQuery
[50:22]完美盛典-2018年度红毯走秀
2018/12/16 DOTA
[01:10:24]DOTA2-DPC中国联赛 正赛 VG vs Aster BO3 第一场 2月28日
2021/03/11 DOTA
python爬虫框架scrapy实战之爬取京东商城进阶篇
2017/04/24 Python
python difflib模块示例讲解
2017/09/13 Python
python面向对象入门教程之从代码复用开始(一)
2018/12/11 Python
Python Pywavelet 小波阈值实例
2019/01/09 Python
Python字典循环添加一键多值的用法实例
2019/01/20 Python
Python学习笔记之抓取某只基金历史净值数据实战案例
2019/06/03 Python
pyqt 实现在Widgets中显示图片和文字的方法
2019/06/13 Python
Flask中endpoint的理解(小结)
2019/12/11 Python
python爬虫添加请求头代码实例
2019/12/28 Python
Python中的wordcloud库安装问题及解决方法
2020/05/27 Python
英国厨房与餐具用品为主的设计品牌:Joseph Joseph
2018/04/26 全球购物
软件测试有哪些?什么是配置项?
2012/02/12 面试题
创业计划书——互联网商机
2014/01/12 职场文书
单方离婚协议书范本(2014版)
2014/09/30 职场文书
2015年教研员工作总结
2015/05/26 职场文书
演讲比赛通讯稿
2015/07/18 职场文书
linux下导入、导出mysql数据库命令的实现方法
2021/05/26 MySQL