1. 程式人生 > >PHP 小技巧之如何避免參數多次傳遞?

PHP 小技巧之如何避免參數多次傳遞?

orm 模式 控制 elf 利用 線程數 url參數 函數參數 fun

開發中經常遇到函數參數傳遞的問題;比如 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 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: [email protected]
 * 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 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("\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 小技巧之如何避免參數多次傳遞?