• 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 AppHttpMiddlewareData;
    
    
    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 AppHttpMiddleware;
    
    use AppHttpMiddlewareDataLoginUserData;
    use IlluminateHttpRequest;
    use Closure;
    
    class BaseInterceptor
    {
        /**
         * 基础拦截器
         *
         * @param Request $request
         * @param Closure $next
         * @return mixed
         * @throws AppExceptionsBusinessException
         */
        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 AppHttpControllers;
    
    use AppHttpMiddlewareDataLoginUserData;
    use IlluminateHttpRequest;
    
    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 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("
    ")
            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
  • 相关阅读:
    oracel 复制A列的内容到列
    视图转为表
    面向对象
    银弹效应
    解决linux删除文件后空间没有释放问题
    HttpAnalyzerStdV7安装教程
    HttpUploader6.2-process版本
    Chrome浏览器控件安装方法
    Firefox浏览器控件安装方法
    通达OA整合教程
  • 原文地址:https://www.cnblogs.com/liugx/p/9922025.html
Copyright © 2020-2023  润新知