开发中经常遇到函数参数传递的问题;比如 A调用B,B调用C,C调用D, A->B->C->D
而D方法可能需要一个参数,这个参数只能在A中获取(比如A是控制器方法),这个参数这样一级一级的传递下去就会显得非常冗余,Java中有 ThreadLocal 这样的用法。
PHP 可以这样用: 利用类的 static 静态属性,这样只需要在存入数据的时候set值,然后用到的时候可以随处可用。和「 注册树」设计模式 同理。
这里举个例子,在URL传递进来的参数,在拦截器中设置(LoginUserData类)静态变量的值,然后可以任何地方通过静态方法调用 LoginUserData::getUser() 获取数据。
1、创建建一个类: (*静态变量不局限于某一种数据结构,为了程序更健壮,最好用一个类;这里演示用了数组)
* User: [email protected]
* Date: 2018/11/4
* Time: 下午7:52*/namespace App\Http\Middleware\Data;classLoginUserData
{private static $user;public function setUser($user)
{
self::$user = $user;
}public static functiongetUser()
{return self::$user;
}
}
View Code
2、在拦截器中处理,根据传递的数据,设置静态变量的值(*这里可以根据token或者session,转换成将用户信息)
* User: [email protected]
* Date: 2018/7/30
* Time: 上午10:22*/namespace App\Http\Middleware;useApp\Http\Middleware\Data\LoginUserData;useIlluminate\Http\Request;useClosure;classBaseInterceptor
{/**
* 基础拦截器
*
* @param Request $request
* @param Closure $next
* @return mixed
* @throws \App\Exceptions\BusinessException*/
function handle(Request $request, Closure $next)
{//已经登录放行
$loginUserData = newLoginUserData();$loginUserData->setUser([‘name‘ => $request->get(‘name‘), ‘age‘ => $request->get(‘age‘)]);return $next($request);
}
}
View Code
3、获取之前存入的值(*,注意不仅仅局限于在控制器层中获取,可以在service层,甚至Util方法中使用)
* Created by PhpStorm.
* User: liugx
* Date: 2018/9/9
* Time: 下午12:57*/namespace App\Http\Controllers;useApp\Http\Middleware\Data\LoginUserData;useIlluminate\Http\Request;class TestController extendsController
{public function test(Request $request)
{sleep("2");$userData = LoginUserData::getUser();return "{$request->get(‘name‘)} = " . $userData[‘name‘] .
",{$request->get(‘age‘)} = " . $userData[‘age‘];
}
}
View Code
4、利用Python并发测试了一把,发现数据没问题「通过URL参数传递的数据,在使用时数据能对上的」。
#-*- coding: utf-8 -*-
importrequestsimportthreadingimporttimeimportrandomclasspostrequests():def __init__(self):
self.url= ‘http://127.0.0.1:1215/itx/test?name={0}&age={1}‘
defpost(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")exceptException as e:print(e)deflogin():
login=postrequests()returnlogin.post()try:
i=0#开启线程数目
tasks_number = 25
print(‘测试启动‘)
time1=time.clock()while i
t= threading.Thread(target=login)
t.start()
i+= 1time2=time.clock()
times= time2 -time1print(times /tasks_number)exceptException as e:print(e)
测试DEMO
原文:https://www.cnblogs.com/liugx/p/9922025.html