[英]Define a global variable in a php class
我有一個 PHP class 具有迭代 function 如下所示:
<?php
class Helper
{
public static function get_children($mid)
{
...
$permission = getPermissionFromDB($mid);
if ($permission)
$mid = get_children($mid);
}
}
這個 function 在每次迭代中都會檢查來自 db 的id
權限。 這僅僅意味着我查詢了 db 千次,這使得加載非常慢。 我在想的是,我需要事先從數據庫中獲取所有 id 權限(針對特定用戶),並將權限 id 存儲在一個數組中(如$permissed_ids
)。 然后使用數組檢查權限,如下所示:
<?php
class Helper
{
public static function get_children($mid)
{
...
$permission = in_array($mid,$permissed_ids);
if ($permission)
$mid = get_children($mid);
}
}
話雖如此,我不知道將$permissed_ids
放在安全的、可在 class 中訪問且特定於用戶的迭代 function 之外的最佳方法是什么。
當任務不簡單時,static 方法可能不是最實用的工具。 無論如何,我知道$permissed_ids
是應用程序范圍的,因此它們可以在實例之間共享,而且它們的獲取成本也很高,因此它們應該在實例之間共享。 它們還依賴於$mid
,因此您需要一個 key => value 結構來存儲它們。 這基本上留下了 static 變量作為最明顯的簡單解決方案(static class 屬性或 ZA81259CEF8E95D329 變量方法:
class Foo
{
private static $a = 'a';
public static function bar()
{
static $b = 'b';
var_dump(self::$a, $b);
}
}
Foo::bar();
(演示)
這只是說明語法的一個簡單示例,您當然可以動態設置值,並且如上所述,您需要一個結構,例如關聯數組。
一個更詳細的例子( 在線):
class Foo
{
private static $permissions = [];
public static function asProperty($mid)
{
if (!isset(self::$permissions[$mid])) {
self::$permissions[$mid] = uniqid($mid . '_prop_', true);
}
echo $mid, ' = ', self::$permissions[$mid], PHP_EOL;
}
public static function asVariable($mid)
{
static $permissions = [];
if (!isset($permissions[$mid])) {
$permissions[$mid] = uniqid($mid . '_var_', true);
}
echo $mid, ' = ', $permissions[$mid], PHP_EOL;
}
}
兩者之間的主要區別在於 class 屬性可以在方法之間共享(如果可見性允許,則可以從其他類訪問)而方法變量不能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.