簡體   English   中英

如何在PHP中的函數外部修改變量/做某事的更好方法

[英]How to modify variables outside of a function in PHP / better way to do something

我有一個包含以下部分的腳本:

function checkDays($oldDate){
    // calculate time
    // Print table row style based on number of days passed 
    // (eg less than 1 week, 1 week, 2 weeks, 3weeks+)
}

//Some code
checkdays($value)

我想對每個時間段內有多少條記錄進行計數,該函數本身在一個循環內,因此它針對表的每一行調用,而且我似乎無法訪問在函數本身外部定義的變量因此我可以更改它們(例如,在腳本頂部放置一個計數器,然后從函數中對其進行修改)。

有人說使用全局變量,但我知道這是一種風險,不建議使用。 有沒有一種簡單的方法可以從函數中訪問變量? 另外,有沒有更好的方法可以整體上在這里做我的工作?

不要試圖使用全局變量

您可以通過引用傳遞變量,這意味着傳遞實際變量,而不是傳遞其副本:

$count = 0;

//Some code
checkdays($value, $count);
checkdays($value, $count);
checkdays($value, $count);

// This will output 3
echo $count;

// Use a & to pass by reference
function checkDays($oldDate, &$count){
    // Your code goes here as normal
    // Increment $count, because it was passed by reference the 
    // actual variable was passed
    // into the function rather than a copy of the variable
    $count++;
}

您可能應該創建一個類,並使用私有屬性來存儲所需的數據。

我認為您要指的風險是register_globals ,這完全是另外一回事。

在函數內部,使用global關鍵字,例如

function myFunction($someParam) {
    global $counter;
    ++$counter;
    // do something
}

或者,您可以執行所謂的傳遞引用來修改傳遞給函數的外部作用域中的變量,例如

function myFunction($someParam, &$counter) {
    ++$counter;
    // do something
}

注意&符。

有關可變范圍的更多信息,請參見PHP手冊頁面。

您可以定義函數的靜態成員,這些成員在函數的范圍之外仍然存在,但僅存在於函數的范圍之內,而不是用無用的變量污染全局名稱空間:

function myFunction($param)
{
  static $count;
  if (empty($count)) $count = 0;
  $count++;

  //rest of your function
}

不幸的是,我似乎找不到在php文檔中記錄此功能的位置。 發現它: 可變范圍

我似乎無法訪問在函數本身外部定義的變量

我錯過了這條線。

如果您在OOP范式中,請使用一個對象來存儲計數器。 否則,可以使用全局變量,但不能直接使用。 如果您使用腳本編寫的范例進行編碼,並且使用的是最新版本的PHP,請使用名稱空間避免污染根名稱空間的全局變量。

如果您不能使用名稱空間,請對所有內容使用偽名稱空間。 代替function someFunction ,使用function projectName_someFunction或其組合。 這樣,您可以合並多個項目,而不必擔心使用錯誤的功能。 以同樣的方式,所有全局變量然后可以存儲為$projectName_someVar

還有其他方法可以對函數/變量名進行偽命名。

使用全局變量的原因是,具有通用名稱的全局變量很容易被覆蓋,並且可能是模棱兩可的: $count count在全局名稱空間中實際上什么?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM