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在线生成ico文件的代码
Oct 09 PHP
php在文件指定行中写入代码的方法
May 23 PHP
PHP命名空间(Namespace)简明教程
Jun 11 PHP
Yii结合CKEditor实现图片上传功能
Jun 13 PHP
php获取从html表单传递数组的方法
Mar 20 PHP
php实现XSS安全过滤的方法
Jul 29 PHP
常用PHP数组排序函数归纳
Aug 08 PHP
降低PHP Redis内存占用
Mar 23 PHP
PHP实现的AES加密、解密封装类与用法示例
Aug 02 PHP
PHP基于面向对象封装的分页类示例
Mar 15 PHP
php过滤htmlspecialchars() 函数实现把预定义的字符转换为 HTML 实体用法分析
Jun 25 PHP
php设计模式之备忘模式分析【星际争霸游戏案例】
Mar 24 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+oracle 分页类
2006/10/09 PHP
php运行报错Call to undefined function curl_init()的最新解决方法
2016/11/20 PHP
滚动经典最新话题[prototype框架]下编写
2006/10/03 Javascript
jQuery html()等方法介绍
2009/11/18 Javascript
Javascript 面向对象 命名空间
2010/05/13 Javascript
基于jQuery的简单的列表导航菜单
2011/03/02 Javascript
jQuery UI Autocomplete 体验分享
2012/02/14 Javascript
IE不支持getElementsByClassName最终完美解决方案
2012/12/17 Javascript
jsp+javascript打造级连菜单的实例代码
2013/06/14 Javascript
jQuery获取(选中)单选,复选框,下拉框中的值
2014/02/21 Javascript
酷炫jQuery全屏3D焦点图动画效果
2016/03/22 Javascript
浅析JS获取url中的参数实例代码
2016/06/14 Javascript
js图片轮播插件的封装
2017/07/21 Javascript
基于Vue SEO的四种方案(小结)
2019/07/01 Javascript
微信小程序点击列表跳转到对应详情页过程解析
2019/09/26 Javascript
vue实现公共方法抽离
2020/07/31 Javascript
Vant 在vue-cli 4.x中按需加载操作
2020/11/05 Javascript
javascript实现前端分页功能
2020/11/26 Javascript
在nodejs中创建child process的方法
2021/01/26 NodeJs
Vue 3自定义指令开发的相关总结
2021/01/29 Vue.js
用Python编写生成树状结构的文件目录的脚本的教程
2015/05/04 Python
深入浅析Python字符编码
2015/11/12 Python
python计算auc指标实例
2017/07/13 Python
python机器学习之随机森林(七)
2018/03/26 Python
css3 中实现炫酷的loading效果
2019/04/26 HTML / CSS
html5利用canvas实现颜色容差抠图功能
2019/12/23 HTML / CSS
canvas画图被放大且模糊的解决方法
2020/08/11 HTML / CSS
华为旗下电子商务平台:华为商城
2016/08/06 全球购物
拖鞋店创业计划书
2014/01/15 职场文书
我爱我校演讲稿
2014/05/21 职场文书
2014广电局实施党的群众路线教育实践活动方案思想汇报
2014/09/22 职场文书
学校运动会广播稿
2014/10/11 职场文书
优秀团员个人总结
2015/02/26 职场文书
幼儿园六一主持词开场白
2015/05/28 职场文书
小学生组织委员竞选稿
2015/11/21 职场文书
php+laravel 扫码二维码签到功能
2021/05/15 PHP