小编典典

全球人是邪恶的

对于global关键字以及从本地范围到全局范围的所有其他内容(静态,单例,注册表,常量)都是如此。您不想使用它们。函数调用不必依赖任何外部条件,例如

function fn()

{

global $foo; // never ever use that

$a = SOME_CONSTANT // do not use that

$b = Foo::SOME_CONSTANT; // do not use that unless self::

$c = $GLOBALS['foo']; // incl. any other superglobal ($_GET, …)

$d = Foo::bar(); // any static call, incl. Singletons and Registries

}

所有这些都会使您的代码依赖于外部。这意味着,您必须先知道应用程序所处的完整全局状态,然后才能可靠地调用其中任何一个。没有该环境,该功能将不存在。

使用超全局变量可能不是一个明显的缺陷,但是如果从命令行调用代码,则没有$_GET或$_POST。如果您的代码依赖于这些代码的输入,则您将自己限制在Web环境中。只需将请求抽象为一个对象,然后使用它即可。

在耦合硬编码的类名(静态,常量)的情况下,如果没有可用的类,您的函数也将不存在。当它来自相同名称空间的类时,这没什么问题,但是当您从不同名称空间开始混合时,您正在创建混乱的混乱。

以上所有因素严重限制了重用。单元测试也是如此。

另外,当您耦合到全局范围时,您的功能签名就在说谎

function fn()

是骗子,因为它声称我可以在不传递任何函数的情况下调用该函数。只有当我看到函数主体时,我才需要将环境设置为特定状态。

如果您的函数需要运行参数,则使它们显式并将其传递给:

function fn($arg1, $arg2)

{

// do sth with $arguments

}

从签名清楚地传达了它需要被称为什么。处于特定状态不依赖于环境。你不必做

$arg1 = 'foo';

$arg2 = 'bar';

fn();

这是引入(全局关键字)与推进(参数)的问题。推入/注入依赖项时,该函数不再依赖外部。当您执行此操作时,您不必fn(1)在外部的某个地方拥有1的变量。但是,当您在$one函数内部引入全局变量时,您会耦合到全局范围,并期望它在某个地方定义了该变量。然后,该功能不再独立。

更糟糕的是,当您在函数内部更改全局变量时,您的代码很快就会变得完全难以理解,因为您的函数到处都有副作用。

如果没有更好的例子,请考虑

function fn()

{

global $foo;

echo $foo; // side effect: echo'ing

$foo = 'bar'; // side effect: changing

}

然后你做

$foo = 'foo';

fn(); // prints foo

fn(); // prints bar

无法看到$foo这三行内容发生了变化。为什么要使用相同的参数调用相同的函数突然改变其输出或更改全局状态下的值?函数应为定义的输入Y执行X。始终。

当使用OOP时,这变得更加严重,因为OOP与封装有关,并且通过扩展到全局范围,您正在破坏封装。您在框架中看到的所有这些Singletons和Registries都是代码气味,应删除它们以利于依赖注入。解耦您的代码。

2020-05-26

php 全局方法,PHP全局函数相关推荐

  1. vue3 注册全局方法 定义全局方法

    1.定义工具类 // 格式化时间 function FormatDate (time: string) {if (Tool.isNotEmpty(time)) {const date = new Da ...

  2. imag.js|快速掌握全局方法

    使用爱码哥进行移动应用开发时,除了了解基本的内容控件.表单控件和布局控件,更重要的是掌握脚本功能.脚本功能是界面之间交互和调用所必不可少的,充分利用脚本功能,会使app动起来,而不是简简单单的静态页面 ...

  3. JavaScript基础08-day10【函数的返回值、实参、立即执行函数、方法、全局作用域、函数作用域、提前声明、this、工厂方法创建对象、构造函数】

    学习地址: 谷粒学院--尚硅谷 哔哩哔哩网站--尚硅谷最新版JavaScript基础全套教程完整版(140集实战教学,JS从入门到精通) JavaScript基础.高级学习笔记汇总表[尚硅谷最新版Ja ...

  4. 【Android 逆向】函数拦截原理 ( 通过修改 GOT 全局偏移表拦截函数 | 通过在实际被调用的函数中添加跳转代码实现函数拦截 )

    文章目录 一.通过修改 GOT 全局偏移表拦截函数 二.通过在实际被调用的函数中添加跳转代码实现函数拦截 一.通过修改 GOT 全局偏移表拦截函数 使用 GOT 全局偏移表 拦截函数 , 只需要将 G ...

  5. 怎么给vue定义全局方法

    一.将方法挂载到Vue.prototype上 二.利用全局混入 三.使用Plugin 通过全局方法 Vue.use() 使用插件.它需要在你调用 new Vue() 启动应用之前完成 在Vue官网就教 ...

  6. nuxt 全局css_解决nuxt 自定义全局方法,全局属性,全局变量的问题

    注意 ,这个 在 asyncData 还是不能用的 ,在mounted等其他生命周期里面可以, asyncData 里因为获取不到this他在组件初始化前执行的,如果找到方法我会继续更新到下一篇博客 ...

  7. vue如何定义:全局变量、全局方法

    开发中会经常用到一些常用的变量和方法   例如ajax这种 一.给vue定义全局变量 1.定义专用模块来配置全局变量 定义一个专用模块来配置全局变量,然后通过export暴露出去,在需要的组件引入gl ...

  8. 如何在vue中设置全局方法

    //js文件部分(可适用于各种js中function方法,不仅仅只有请求) //export 导出方法 export function getDicts(dictType) {return reque ...

  9. VUE2.0全局方法注册

    vue2.0全局方法注册 上一篇简单记录了时间格式方法,如果将其注册为全局方法,就可以在项目中随时调用. 1.新建common.js文件: 新建js文件,定义函数并将其暴露出来. function f ...

  10. window对象的全局方法

    window对象的全局方法 1.window.alert('嘿'):显示带有一段消息和一个确认按钮的警告框. 2.window.prompt():显示可提升用户输入的对话框 3.window.conf ...

最新文章

  1. crontab安装_django-crontab实现服务端的定时计划任务
  2. MySQL5.6.35数据库多实例二进制安装
  3. Android 用Animation-list实现逐帧动画
  4. OFDM资料(待总结)
  5. Linux疑难杂症解决方案100篇(十三)-TCP中的拥塞控制
  6. picf509c语言程序,樊媛媛c语言程序设计09编译预处理.pptx
  7. 使用java进行文件编码转换
  8. LiveVideoStackCon深圳-服务端的任务越来越重
  9. 【转】Linux下c++调用自己编写的matlab函数:通过mcc动态链接库.so实现
  10. 无法开启计算机,Win7下鼠标右键无法开启计算机属性怎么办?
  11. Docker容器学习
  12. c#参数修饰符-params
  13. android 应用切换滑动,Android应用中利用ViewPager实现多页面滑动切换效果示例
  14. 问题六十三:怎么用ray tracing画sphere sweeping图形(2)——teapot
  15. idea开发springboot的一些小干货
  16. 破解,汉化,越狱,解锁,为什么中国的大神总是“昙花一现”?
  17. 为什么软件需要数字签名?代码签名证书的作用
  18. Iphone5的机身4S的配置 山寨版“iPhone 5S”上手视频
  19. 快搜-谷歌-网址记录
  20. 如何查看office是否永久激活版本

热门文章

  1. C# 访问数据的时候报错 (拒绝了对对象 'XXXX' (数据库 'SHQY',架构 'dbo')的 SELECT 权限)...
  2. java求字符串数组交集、并集和差集
  3. IOS开发之页面跳转
  4. 【Tensorlayer系列】深度强化学习之FrozenLake介绍及表格型Q学习求解
  5. 【Matlab学习笔记】【数学形态学】数字图像处理(MATLAB版)冈萨雷斯第九章学习笔记
  6. 边缘计算与嵌入式系统
  7. 基于麻雀搜索算法的极限学习机(ELM)分类算法-附代码
  8. ArcGIS 查看运行结果
  9. 教务管理系统C++全部代码
  10. word中设置论文中英文参考文献对齐方法