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

Posted liugx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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: [email protected]
 * 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: [email protected]
 * 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

 

以上是关于PHP 小技巧之如何避免参数多次传递?的主要内容,如果未能解决你的问题,请参考以下文章

操作栏选项卡:使用多次实例化的单个片段时如何传递参数

如何绕过将数据模型传递给片段参数以避免事务太大异常?

使 PHP 代码更加简洁的几个小技巧

需要一种有效的方法来避免使用 Laravel 5 重复代码片段

如何多次使用同一个片段?

Android课程---Android Studio使用小技巧:提取方法代码片段