开发中经常遇到函数参数传递的问题;比如 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. CentOS搭建“加速器”

    1.安装Shadowsocks 服务端 yum -y update yum install -y python-setuptools && easy_install pip pip i ...

  2. dns 服务架构优化 - 百万级并发不是梦 - bind+namedmanager+dnsmasq

    bind: DNS服务端. namedmanager: DNS web管理页面. dnsmasq: 并发查询上游dns域名解析. 问题:作为消息推送业务,单台业务机器域名解析并发达到上万次.业务机器集 ...

  3. node -- hapi 学习

    node learning 学习node,是为了后续项目可以正常开展,现在写个项目,若不是连接后台,请求数据,一切都不叫着项目了.正好借助掘金的小册,来推进学习 学习资料 YouTube 1 掘金 h ...

  4. canvas绘制直线

    HTML5 <canvas>元素用于图形的绘制,该元素只是图形容器,必须使用javascript脚本绘制图形创建一个画布:<canvas id="myCanvas" ...

  5. mysql创建索引-----高性能(五)

    转载地址:https://www.cnblogs.com/llzhang123/p/7889382.html 索引的创建可以在CREATE TABLE语句中进行,也可以单独用CREATE INDEX或 ...

  6. learning scala read from console

    控制台输入语句: readInt, readDouble, readByte, readShort, readLong, readChar, readBoolean, readLine example ...

  7. 自动化测试框架Taffy

    Taffy Taffy是基于nosetests的自动化测试框架. Taffy主要用来测试后台服务(包括且不限于Http, Dubbo/hessian, Webservice, Socket等类型接口) ...

  8. 16 extern用法、常量字符串的应用

    extern声明多文件共享变量的方法总结一下: 1).在一个源文件中定义,在其他需要使用的源文件中用extern声明.(仅一处定义,多处extern) 2).在一个源文件中定义,在其对应的头文件中ex ...

  9. TMemo的ScrollBars属性和大文本

    给TMemo.Text := '几M大的文本'; 如果 ScrollBars 不是 sbBoth的话,程序很可能 无响应. 今天郁闷了半天才发现的.

  10. SharePoint Web应用程序管理-PowerShell

    1. 显示场中的Web应用程序 Get-SPWebApplication 2. 获取指定的Web应用程序 $webApp = Get-SPWebApplication -Identity " ...