Почему переменная не может начинаться с числа?

Я работаю в 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 ответов

Решение

Вот как был разработан PHP. Вы не можете начать имя переменной с числа.

Что вы можете сделать, это использовать подчеркивание:

$_6 = $_REQUEST['6'];

РЕДАКТИРОВАТЬ: так как переменные начинаются с $ в PHP, было бы возможно иметь переменные, начинающиеся с цифр, но это было бы немного смущает большинство людей, так как нет другого языка, который позволяет переменные, начинающиеся с цифр (или, по крайней мере, я не не знаю ни одного).

Но давайте представим, что переменные, начинающиеся с цифр, разрешены.

Можете ли вы представить себе коллегу, который говорит вам: 23 равно 74? Это немного сбивает с толку. Слушание n23 равно 74 имеет больше смысла. Вы знаете, что n23 - это переменная без явного указания этого.

Да, вы можете объявить переменные в PHP, которые начинаются с числа:

${'1'} = 'hello';

Это объявляет переменную с именем переменной "1" в PHP.

Чтобы получить к нему доступ, вам нужно снова использовать синтаксис скобки:

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 объясняют подробности этого, также есть много вопросов, связанных с цитированием идентификаторов как для PHP, так и для Mysql на веб-сайте Stackru.

Это не имеет смысла. Но вы все равно можете использовать динамические имена переменных.

<?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);

Чтобы увеличить ответ @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.

Хорошо подумайте об этом:

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

Что это? 2,0? или 42?

Подсказка, если вы не получили его, d после числа означает число перед двойным литералом

Сложно однозначно определить, представляет ли числовой символ в модуле компиляции литерал или идентификатор.

Языки, где пробел незначителен (например, АЛГОЛ и оригинальный ФОРТРАН, если я правильно помню), не могут принимать числа для начала идентификаторов по этой причине.

Это идет далеко - до специальных обозначений для обозначения хранения или числовой базы.

Для более подробного обсуждения посетите Почему имена переменных не могут начинаться с цифр?

Прежде всего PHP был разработан как a variable can't start with a number. Большинство языков следуют одному и тому же правилу именования. Это в основном дляbetter readability а также compiling performance optimisation. При лексическом анализе во время компиляции исключается возврат с возвратом.

Предположим, переменная вроде:

test = 12;
123test = 12;

Компилятор будет знать test является идентификатором сразу после встречи с буквой "т".

И в случае 123test, компилятор не сможет решить, является ли это числом или идентификатором, пока он не достигнет 't' после 3, и в результате требуется возврат.

Как сказано в документации php, вы не можете:

основы

Переменные в PHP представлены знаком доллара, за которым следует имя переменной. Имя переменной чувствительно к регистру.

Имена переменных следуют тем же правилам, что и другие метки в PHP. Допустимое имя переменной начинается с буквы или подчеркивания, за которым следует любое количество букв, цифр или подчеркивания.

Как регулярное выражение, оно будет выражаться так: [a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*

Что касается MySQL, документация гласит:

Идентификаторы могут начинаться с цифры, но если они не указаны, они могут состоять не только из цифр.

ВСЕ ОТВЕТЫ, КОТОРЫЕ ГОВОРИТ, ЧТО ВЫ МОЖЕТЕ СОЗДАТЬ ПЕРЕМЕННУЮ ЧИСЛО В PHP, НЕПРАВИЛЬНЫ!

Все ответы, в которых говорится, что {num} фактически создает переменную с именем num, неверны.

Если мы создадим переменную, которая является числом, используя {1}, переменная $GLOBALS не будет иметь его.

Но массив, возвращаемый get_defined_vars() наверно, есть (иногда не понимаю)...

Теперь, если я применяю эту логику другим способом, используя $GLOBALS для определения переменной, то же самое обязательно произойдет.

Использование этой (грязной / нестабильной) логики определенно не рекомендуется (как это прямо описано в документации), и я почти уверен, что вы никогда не откажетесь от имен переменных при программировании, если вы не слишком увлечены синтаксической краткостью.

Поэтому, пожалуйста, избегайте использования чисел в начале / в качестве имен переменных, как вы ожидали бы сделать на других языках.

Это своего рода наследие, начиная с ранее разработанных языков, таких как C, Fortran и т. Д. Кроме того, некоторые языки сценариев оболочки имеют специальные средства для идентификаторов, которые начинаются с цифры, а именно входные параметры. Стандарты PHP просто решили соблюдать это общее правило.

Вы не можете назвать переменную, начинающуюся с числа (или просто числа в этом отношении). То, что вы можете сделать, это использовать другой символ для начала (например, подчеркивание, или трехбуквенную комбинацию, говорящую, что это за тип переменной:

$_1 = $_REQUEST['1'];

или же

$str1 = $_REQUEST['1'];

Что вы также можете сделать, это использовать массив:

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

Таким образом, вы можете проходить через оба одновременно:

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

Вы не можете определить переменную, начинающуюся с цифр в PHP. Посмотрите на ссылку ниже. Он имеет основы определения переменных.

Переменные PHP - Основы

Другие вопросы по тегам