为什么变量不能以数字开头?

时间:2013-03-15 08:09:53

标签: php variables numbers

我在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中创建和使用同名的字段吗?

11 个答案:

答案 0 :(得分:14)

这就是PHP的设计方式。您无法使用数字启动变量名称。

你可以做的是使用下划线:

$_6 = $_REQUEST['6'];

修改 因为变量以PHP中的 $ 开头,所以可能有变量以数字开头,但这对大多数人来说有点混乱,因为没有其他语言允许变量以数字开头(或者至少我不知道。)

但是让我们假设允许以数字开头的变量。

你能想象一个同事对你说: 23等于74?这有点令人困惑。听力 n23等于74 更有意义。您知道 n23 是一个变量而无需明确说明。

答案 1 :(得分: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的标识符也有很多相关的问题。

答案 2 :(得分: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);

答案 3 :(得分:1)

好好想想:

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

什么是? 2.0?还是42?

提示,如果你没有得到它,d之后的数字意味着它是双字面之前的数字

难以明确地确定编译单元中的数字字符是表示文字还是标识符。

空间无关紧要的语言(如果我没记错的话,就像ALGOL和原来的FORTRAN一样)因为这个原因无法接受数字来开始标识符。

这可以追溯到 - 在表示存储或数字基础的特殊符号之前。

有关更详细的讨论,请访问Why can't variable names start with numbers?

答案 4 :(得分:0)

正如php documentation所说,你不能:

  

基本

     

PHP中的变量由美元符号后跟变量名称表示。变量名称区分大小写。

     

变量名遵循与PHP中其他标签相同的规则。一个有效的   变量名称以字母或下划线开头,后跟任意名称   字母,数字或下划线的数量。

     

作为正则表达式,它将表达为:   [a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*

关于MySQL,documentation说:

  

标识符可以以数字开头,但除非引用可能不包含   只是数字。

答案 5 :(得分:0)

你无法在PHP中定义一个以数字开头的变量。看看下面的链接。它具有定义变量的基础知识。

PHP Variables - Basics

答案 6 :(得分:0)

这是一种遗留问题,从早期开发的语言开始,如C,Fortran等。此外,一些shell脚本语言对于以数字开头的标识符(即输入参数)具有特殊的方法。 PHP标准只是决定遵守这个一般规则。

答案 7 :(得分:0)

您无法命名一个以数字开头的变量(或只是一个数字)。 你可以做的是使用另一个字符开始(例如,下划线,或3个字母组合,说明它是什么类型的变量:

$_1 = $_REQUEST['1'];

$str1 = $_REQUEST['1'];

您还可以使用数组:

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

这样你就可以同时循环遍历两者:

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

答案 8 :(得分: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" } 

另外我发现了一些有趣的东西:

<?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而true评估为1。

答案 9 :(得分:0)

首先PHP被设计为a variable can't start with a number。大多数语言都遵循相同的命名规则。这主要用于better readabilitycompiling performance optimisation。编译时在词法分析中避免回溯。

假设变量如下:

test = 12;
123test = 12;

编译器在遇到字母“ t”时会立即知道test是标识符。

123test的情况下,编译器将无法确定它是数字还是标识符,直到它在3之后命中“ t”,并且结果需要回溯。

答案 10 :(得分:0)

所有说可以在 PHP 中成功创建 NUM 变量的答案都是错误的!

所有说 {num} 实际上创建一个名为 num 的变量的答案都是错误的。

如果我们使用 {1} 创建一个数字变量,$GLOBALS 变量将没有它。

但是 get_defined_vars() 返回的数组可能会有它(我有时不明白)...

现在如果我以另一种方式应用这个逻辑,通过使用 $GLOBALS 来定义一个变量,同样的事情肯定会发生。

绝对不推荐使用这种(脏/不稳定)逻辑(如文档中直接描述的那样),我很确定您在编程时永远不会缺少变量名,除非您对语法过于简洁。

因此请避免在开头使用数字/作为变量名称,因为您在其他语言中会这样做