开发中经常遇到函数参数传递的问题;比如 A调用B,B调用C,C调用D, A->B->C->D

而D方法可能需要一个参数,这个参数只能在A中获取(比如A是控制器方法),这个参数这样一级一级的传递下去就会显得非常冗余,Java中有 ThreadLocal 这样的用法。

PHP 可以这样用: 利用类的 static 静态属性,这样只需要在存入数据的时候set值,然后用到的时候可以随处可用。和「 注册树」设计模式 同理。

这里举个例子,在URL传递进来的参数,在拦截器中设置(LoginUserData类)静态变量的值,然后可以任何地方通过静态方法调用 LoginUserData::getUser() 获取数据。

1、创建建一个类: (*静态变量不局限于某一种数据结构,为了程序更健壮,最好用一个类;这里演示用了数组)

<?php
/**
* User: szliugx@gmail.com
* Date: 2018/11/4
* Time: 下午7:52
*/ namespace App\Http\Middleware\Data; class LoginUserData
{
private static $user; public function setUser($user)
{
self::$user = $user;
} public static function getUser()
{
return self::$user;
}
}

2、在拦截器中处理,根据传递的数据,设置静态变量的值(*这里可以根据token或者session,转换成将用户信息)

<?php
/**
* User: szliugx@gmail.com
* Date: 2018/7/30
* Time: 上午10:22
*/ namespace App\Http\Middleware; use App\Http\Middleware\Data\LoginUserData;
use Illuminate\Http\Request;
use Closure; class BaseInterceptor
{
/**
* 基础拦截器
*
* @param Request $request
* @param Closure $next
* @return mixed
* @throws \App\Exceptions\BusinessException
*/
function handle(Request $request, Closure $next)
{ // 已经登录放行
$loginUserData = new LoginUserData();
$loginUserData->setUser(['name' => $request->get('name'), 'age' => $request->get('age')]); return $next($request);
}
}

3、获取之前存入的值(*,注意不仅仅局限于在控制器层中获取,可以在service层,甚至Util方法中使用)

<?php
/**
* Created by PhpStorm.
* User: liugx
* Date: 2018/9/9
* Time: 下午12:57
*/ namespace App\Http\Controllers; use App\Http\Middleware\Data\LoginUserData;
use Illuminate\Http\Request; class TestController extends Controller
{ public function test(Request $request)
{
sleep("2");
$userData = LoginUserData::getUser();
return "{$request->get('name')} = " . $userData['name'] .
",{$request->get('age')} = " . $userData['age'];
}
}

4、利用Python并发测试了一把,发现数据没问题「通过URL参数传递的数据,在使用时数据能对上的」。

# -*- coding: utf-8 -*-
import requests
import threading
import time
import random class postrequests():
def __init__(self):
self.url = 'http://127.0.0.1:1215/itx/test?name={0}&age={1}' def post(self):
if random.randint(1, 99) % 2 == 0:
url = self.url.format('a', random.randint(10000, 100000))
else:
url = self.url.format('b', random.randint(1, 10000))
try:
r = requests.get(url)
print(r.text)
print("\n")
except Exception as e:
print(e) def login():
login = postrequests()
return login.post() try:
i = 0
# 开启线程数目
tasks_number = 25
print('测试启动')
time1 = time.clock()
while i < tasks_number:
t = threading.Thread(target=login)
t.start()
i += 1
time2 = time.clock()
times = time2 - time1
print(times / tasks_number)
except Exception as e:
print(e)

测试DEMO

PHP 小技巧之如何避免参数多次传递?的更多相关文章

  1. Zabbix下查看参数的小技巧

    我们在管理.维护Zabbix的时候,经常需要查看配置文件下的一些参数信息.下面介绍一些常用的小技巧. 1:我想知道zabbix_server.conf文件中配置了那些参数. # grep '^[a-Z ...

  2. 前端网络、JavaScript优化以及开发小技巧

    一.网络优化 YSlow有23条规则,中文可以参考这里.这几十条规则最主要是在做消除或减少不必要的网络延迟,将需要传输的数据压缩至最少. 1)合并压缩CSS.JavaScript.图片,静态资源CDN ...

  3. linux系统维护时的一些小技巧,包括系统挂载新磁盘的方法!可收藏!

    这里发布一些平时所用到的小技巧,不多,不过会持续更新.... 1.需要将history创建硬链接ln 全盘需要备份硬链接 ln /etc/xxx /home/xxx 2.root用户不可以远程 /et ...

  4. iOS:小技巧(不断更新)

    记录下一些不常用技巧,以防忘记,复制用. 1.获取当前的View在Window的frame: UIWindow * window=[[[UIApplication sharedApplication] ...

  5. 最强 Android Studio 使用小技巧和快捷键

    写在前面 本文翻译自 Android Studio Tips by Philippe Breault,一共收集了62个 Android Studio 使用小技巧和快捷键. 根据这些小技巧的使用场景,本 ...

  6. ios开发中的小技巧

    在这里总结一些iOS开发中的小技巧,能大大方便我们的开发,持续更新. UITableView的Group样式下顶部空白处理 //分组列表头部空白处理 UIView *view = [[UIViewal ...

  7. STM32之ADC+步骤小技巧(英文)

    神通广大的各位互联网的网友们.大家早上中午晚上好好好.今早起来很准时的收到了两条10086的扣月租的信息.心痛不已.怀着这心情.又开始了STM32的研究.早上做了计算机控制的PID实验,又让我想起了飞 ...

  8. Windows Azure一些小技巧集合

    我最近做了一个Windows Azure上面的项目,自己在做的过程中遇到了很多问题.有的是我自己摸索解决,有的是到网上寻找零碎的信息结合起来解决的.我感觉应当把某些解决方法集中一下,方便我以后查阅,也 ...

  9. 玩转Windows服务系列——Windows服务小技巧

    伴随着研究Windows服务,逐渐掌握了一些小技巧,现在与大家分享一下. 将Windows服务转变为控制台程序 由于默认的Windows服务程序,编译后为Win32的窗口程序.我们在程序启动或运行过程 ...

随机推荐

  1. git and github问题集锦

    本人遇到的:

  2. 关于如何使用cg中的discard/clip

    Pass { ZTest Always Cull Off ZWrite Off Fog { Mode off } Blend Off CGPROGRAM #pragma vertex vert_img ...

  3. DevExpress v17.2新版亮点—ASP.NET篇(三)

    用户界面套包DevExpress v17.2终于正式发布,本站将以连载的形式为大家介绍各版本新增内容.本文将介绍了DevExpress ASP.NET v17.2 的GridView Control. ...

  4. beta阶段贡献分配实施

    作业要求[https://edu.cnblogs.com/campus/nenu/2018fall/homework/2281] 要求1 每位组员的贡献分值   刘莹莹 王玉潘 潘世维 周昊 赵美增 ...

  5. C一次将整个文件读入内存

    最近工作,有个需求需要将YUV的整个文件读入内存,然后处理这些YUV数据,一种比较有效的方法如下: #include <stdio.h> #include <stdlib.h> ...

  6. 分析:新建短信,当我们接受人RecipientsEditor中输入+86的时候,系统会自动在+86后加入空格

    我们可以认为这是一个很人性的格式化操作,在ComposeMessageActivity中系统在调用initRecipientsEditor()方法对联系人进行初始化的时候调用了 PhoneNumber ...

  7. 拦截器interceptors

    拦截器interceptors 1. 基于HandlerMapping,对请求实施拦截,根据业务需求,基于不同的HandlerMapping定义多个拦截器 2. HandlerInterceptor接 ...

  8. webstrom vue配置eslint

    (得出结论,还是得从官方文档中找,哇!!) 1.安装eslint插件,可以从search in repositories中获得,或者:http://plugins.jetbrains.com/plug ...

  9. Linux文件共享(单进程之间、多进程之间)

    转载:https://www.cnblogs.com/frank-yxs/p/5925603.html 在同一个进程中,实现文件共享的方法有两种: 多次使用open函数打开相同文件 使用dup/dup ...

  10. Apache和iis的冲突处理

    http://wenku.baidu.com/link?url=N4GYFpkQyr8G0kVEy3AR2Q5FBho8EOle-_5inEfEq6QSxlyzB3xSbcpeugRdExkSU-tw ...