2013-03-15 81 views
5

我在PHP工作,我必須按順序定義變量以保存在Mysql中。在我的情況下,字段名稱和變量名稱必須相同。爲什麼變量不能以數字開頭?

我可以聲明這樣

$1 OR $2 etc 

如果不是,爲什麼不是,如果是一個變量,爲什麼是嗎?

我想:

$id = 0; 
$6 = $_REQUEST['6']; 
$7 = $_REQUEST['7']; 
$8 = $_REQUEST['8']; 

$xary = array('6','7','8','9') 

$oAppl->save_record("tablename", $id, "id"); 

它給我的錯誤。

也可以創建和使用Mysql中的字段具有相同的名稱?

+0

Php可能具有以數字開頭的變量,因爲每個變量都預置了$。但這是一個慣例。 – Ihsan 2013-03-15 08:21:36

+0

你想要一些類似的功能嗎? Php很靈活。例如,你可以用這樣的循環創建$ i0到$ i15:for($ x = 0; $ x <15; $ x ++)$ GLOBALS ['i'。$ x] = null; – Ihsan 2013-03-15 08:27:05

+0

[爲什麼不能以數字開頭的變量名稱?](http://stackoverflow.com/questions/342152/why-cant-variable-names-start-with-numbers) – 2015-03-18 12:39:26

回答

14

這是PHP是如何設計的。您無法使用數字開始變量名稱。

你可以做的是使用下劃線:

$_6 = $_REQUEST['6']; 

編輯: 自變量是在PHP與$開始,是有可能有開始與數字變量,但是這將是一個有點讓大多數人感到困惑,因爲沒有其他語言允許以數字開頭的變量(或者至少我不知道)。

但讓我們假設允許以數字開頭的變量。

你能想象一位同事對你說:23等於74嗎?這有點令人困惑。聽力n23等於74更有意義。你知道n23是一個變量,不必明確地說。

+2

但爲什麼?爲什麼不能我們 – Methew 2013-03-15 08:28:21

+0

@Methew:請參閱編輯 – 2013-03-15 08:54:04

+0

PHP確實允許只包含數字的變量名稱。在Mysql中使用相同的標識符 - 這只是一個問題,如果這是有用的。但要真正回答具體問題:http://stackoverflow.com/a/19054047/367456 – hakre 2013-09-27 15:04:39

0

隨着php documentation說,你不能:

基礎

PHP中的變量用一個美元符號後面跟變量名來表示。變量名稱區分大小寫。

變量名稱遵循與PHP中其他標籤相同的規則。有效的 變量名稱以字母或下劃線開頭,後面跟着任何 字母,數字或下劃線的數字。

用正則表達式,它將被表述爲: [a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*

關於MySQL中的documentation說:

標識符可以以數字開始,但除非報價可能不是由 只數字。

0

你不能在PHP中定義一個以數值開頭的變量。看看下面的鏈接。它具有定義變量的基礎知識。

PHP Variables - Basics

1

那麼想想這個:

$2d = 42; 
$a = 2d; 

什麼是? 2.0?或42?

提示,如果你不明白這一點,一個數後d意味着數字之前,它是在unambiguosly確定編譯單元數字字符是否代表一個文字或雙字面

有難度被標識符。

空間不重要的語言(如ALGOL和原來的FORTRAN,如果我沒有記錯的話)不能接受數字開始標識符的原因。

這回過來 - 特殊符號表示存儲或數字庫之前。

對於更詳細的討論訪問Why can't variable names start with numbers?

+0

+1爲額外的鏈接。 – Vesper 2013-03-15 08:18:07

+1

在這種情況下,這是非常錯誤的。這是對C語法的一個答案。PHP變量以$開頭,所以你的例子實際上在語法上是錯誤的。 ($ 2d不是2d) – 2015-07-06 09:34:03

+0

PHP變量以$開頭。沒有理由不允許數字。除了像[新娘,烤剁結束。](http://www.snopes.com/weddings/newlywed/secret.asp) – 2016-01-07 11:12:19

0

這是某種傳統,從早期開發的語言如C,Fortran等開始。另外一些shell腳本語言對於以數字開頭的標識符(即輸入參數)有特殊的方法。 PHP標準只是決定遵守這個通用規則。

0

你不能命名一個以數字開頭的變量(或者只是一個數字)。 你可以做的是使用另一個字符開始(例如,和下劃線,或3 lettercombo稱它是什麼類型的變量:

$_1 = $_REQUEST['1']; 

$str1 = $_REQUEST['1']; 

還可以做什麼在使用數組:

$retrievedValuesFromDB = array(); 
$retrievedValuesFromDB['1'] = $_REQUEST['1']; 

這種方式可以通過兩個在同一時間循環:

$i=1; 
while ($i<mysql_num_rows()) 
{ 
    $retrievedValuesFromDB[$i] = $_REQUEST[$i]; 
    $i++; 
} 
5

是你可以宣佈在PHP以數字開頭的變量:

${'1'} = 'hello'; 

此聲明與PHP變量名"1"變量。

要訪問它,你需要再次使用括號語法:

echo ${'1'}; 

這是必要的,因爲在PHP代碼逐字你不能寫:

echo $1; 

這將使一個語法錯誤。


也可以我在MySQL創建和使用領域具有相同的名稱?

是的,你可以,它的工作原理與PHP相似。在MySQL以及需要引用的唯一數標識符列,則引用的不同:

mysql> create table test (`0` INT); 
mysql> describe test; 
+-------+---------+------+-----+---------+-------+ 
| Field | Type | Null | Key | Default | Extra | 
+-------+---------+------+-----+---------+-------+ 
| 0  | int(11) | YES |  | NULL |  | 
+-------+---------+------+-----+---------+-------+ 

這裏使用的反引號(MySQL默認配置)。 PHP手冊和Mysql手冊都解釋了這個細節,在Stackoverflow網站上也有許多相關的問題來引用PHP和Mysql的標識符。

+0

解碼具有以數字開頭的變量名的json,訪問它的唯一方法是使用hakre提出的語法。有$ json ='{「52WeekChange」:「0,3」}';你可以訪問$ decode - > {'52WeekChange'}; – Tama 2017-03-23 17:53:38

+0

我想到這一點。這是最接近你的。但從技術上講,您的變量始於花括號;-) – 2018-02-23 08:22:05

2

這沒有意義。 但是你仍然可以使用變量的動態名稱。

<?php 

$name = 1; 

$ $name = 'name'; 
// $ 1 = 'name'; // the same, but syntax not allowed 

var_dump($ $name); // value of $1 
var_dump(${$name}); 
var_dump($$name); 
0

爲了增強@ hakre的答案,你也可以失去的報價爲簡潔

${1}

但很可惜,你不能結合起來,與一個字符串值。我做了一些實驗,顯然PHP期望一個字符串或數字值。你可以在大括號內做任何事情,最終返回一個數字或一個字符串值,或者隱式地轉換成任何一個。

<?php 
function eight(){ 
    return 8; 
} 
${7+'fr'} = ${7*'fr'+1} = ${'hi'.((string)8).'hi'} = ${7.8910} = ${eight()} = ${(eight()==true)+4} = 'hi'; 

var_dump(get_defined_vars()); 

輸出

array(8) { ["_GET"]=> array(0) { } 
["_POST"]=> array(0) { } 
["_COOKIE"]=> array(0) { } 
["_FILES"]=> array(0) { } 
["7.891"]=> string(2) "hi" 
["7"]=> string(2) "hi" 
["1"]=> string(2) "hi" 
["hi8hi"]=> string(2) "hi" 
["8"]=> string(2) "hi" 
["5"]=> string(2) "hi" } 

Addtionally我發現了一些有趣的事情:

<?php 
${false} = 'hi'; 
${true} = 'bye'; 

var_dump(get_defined_vars()); 

輸出

array(6) { ["_GET"]=> array(0) { } 
["_POST"]=> array(0) { } 
["_COOKIE"]=> array(0) { } 
[""]=> string(2) "hi" 
["1"]=> string(3) "bye" } 

這意味着false計算結果爲空字符串,而不是0 nd true改爲1.

相關問題