2012-06-02 38 views
1

uuid_create要求參數按引用傳遞。uuid-php.x86_64 uuid_create()「參數未通過引用傳遞」問題

uuid_create(&$foo); 

的問題是,這會產生錯誤:

Message: Call-time pass-by-reference has been deprecated 

是PHP擴展uuid-php.x86_64過時?它不與PHP 5「兼容」。有哪些替代方案?

只是想突出顯示這不是重複的。

$foo = NULL; 

uuid_create($foo); 

會產生:

Type:  Run-time warnings (non-fatal error). 
Message: uuid_create(): uuid_create: parameter wasn't passed by reference 
+0

沒有。你只需要把'$ foo'放在那裏,而沒有'&'放在前面,就是這樣。我在這裏寫一個評論,然後搜索重複,前幾天我們有這個問題。 – hakre

+0

[Call-time pass-by-reference已被棄用;](http://stackoverflow.com/questions/4665782/call-time-pass-by-reference-has-been-deprecated) – hakre

+0

我結束了up'使用'exec('uuid -v 4')'。 – Gajus

回答

3

PHP沒有一個方法uuid_create所以如果它來自一個擴展它最有可能不是一個官方的一個,可能已經過時它不是在文檔中提到的。函數期望out參數而不是返回值的事實已經是一個非常明顯的跡象,表明該函數相當糟糕。

然而,編寫PHP代碼來生成一個uuid4是因爲它使用了所有的字段隨機值很容易的,也就是說,你不必訪問系統特定的東西,一個MAC地址:

function uuid4() { 
    return sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x', 
     // 32 bits for "time_low" 
     mt_rand(0, 0xffff), mt_rand(0, 0xffff), 

     // 16 bits for "time_mid" 
     mt_rand(0, 0xffff), 

     // 16 bits for "time_hi_and_version", 
     // four most significant bits holds version number 4 
     mt_rand(0, 0x0fff) | 0x4000, 

     // 16 bits, 8 bits for "clk_seq_hi_res", 
     // 8 bits for "clk_seq_low", 
     // two most significant bits holds zero and one for variant DCE1.1 
     mt_rand(0, 0x3fff) | 0x8000, 

     // 48 bits for "node" 
     mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff) 
    ); 
} 
+0

我懷疑這是否比'exec('uuid -v 4')'快。 – Gajus

+0

http://svn.php.net/viewvc/pecl/uuid/trunk/uuid.c?revision=297236&view=markup - 但我對TS看到的警告有些困惑。函數正常返回。 – hakre

+0

@Guy:我以爲是。無需創建新的進程等。 – ThiefMaster