php参数只能安顺序传递吗,PHP 小技巧之如何避免参数多次传递?

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

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

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

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

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

e85187c52155e122f36a3bee259123fd.png

2b65ef29a5872cc0e4771c25889edd04.gif

6a087676c59fa8b19d76e6bb55a32902.gif

* 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,转换成将用户信息)

c83e2f9efe2d3c25a5da3f2505f057ab.png

2b65ef29a5872cc0e4771c25889edd04.gif

6a087676c59fa8b19d76e6bb55a32902.gif

* 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方法中使用)

af727c69780bc22797404f64e1dfd824.png

2b65ef29a5872cc0e4771c25889edd04.gif

6a087676c59fa8b19d76e6bb55a32902.gif

* 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参数传递的数据,在使用时数据能对上的」。

d47972e84a990f34bb7af916a397ec6a.png

2b65ef29a5872cc0e4771c25889edd04.gif

6a087676c59fa8b19d76e6bb55a32902.gif

#-*- 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值