分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 运营维护

PHP 小技巧之如何避免参数多次传递?

发布时间:2023-09-06 02:21责任编辑:林大明关键词:PHP

开发中经常遇到函数参数传递的问题;比如 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; ???}}
View Code

 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); ???}}
View Code

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‘]; ???}}
View Code

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

# -*- coding: utf-8 -*-import requestsimport threadingimport timeimport randomclass 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 小技巧之如何避免参数多次传递?

原文地址:https://www.cnblogs.com/liugx/p/9922025.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved