Echo () принимает числа? - PullRequest
       7

Echo () принимает числа?

7 голосов
/ 05 августа 2011

Я относительно новичок в программировании и все еще не уверен в себе, когда читаю языковую документацию. Описание эха PHP от php.net:

void echo ( string $arg1 [, string $... ] )

Таким образом, мне кажется, что входные параметры должны иметь тип string. Однако эхо работает с числами. Например, код ...

<p><?php echo 3; ?></p>

... успешно печатает 3 на странице. Тогда не должен ли тип параметра для $ arg1 и $ ... быть псевдотипом mixed (вместо просто строки), чтобы показать, что echo будет принимать строки или чисел? В противном случае, как я могу из документации сделать вывод, что числовые параметры приемлемы?

Ответы [ 6 ]

8 голосов
/ 05 августа 2011
3 голосов
/ 05 августа 2011

Тогда не должен ли тип параметра для $ arg1 и $ ... быть смешанным псевдотипом (а не просто строкой), чтобы показать, что echo будет принимать строки или числа?

На самом деле в руководстве string также является своего рода псевдотипом. Это не настоящий псевдотип типа mixed (см. Псевдотипы и переменные, используемые в документации PHP ).

Если быть более точным, string набирается свободно :

PHP не требует (или не поддерживает) явного определения типа в объявлении переменной; тип переменной определяется контекстом, в котором используется переменная . [выделено мной] То есть, если строковое значение присваивается переменной $ var, $ var становится строкой. Если целое значение затем присваивается переменной $ var, оно становится целым числом.

Как и для переменных, то же самое относится к другим типам выражений : тип выражения определяется контекстом, в котором используется выражение .

В вашем случае выражение 3 используется в строковом контексте функции echo. У PHP нет проблем с использованием 3 в качестве строки, поэтому вы не получите сообщение об ошибке, и оно отобразится (в виде строки).

В противном случае, как я могу из документации сделать вывод, что числовые параметры приемлемы?

echo ожидает string параметров. Когда вы передаете (переменное) выражение, которое представляет собой строку, число, логическое значение, NULL или ресурс (см. Types ), все эти типы используются в качестве строк. Поэтому, когда вы видите string в качестве типа, просто используйте строковое выражение. Это не означает, что вам нужно явно определить выражение как строку, чтобы оно работало, поскольку в PHP нет явного определения типа.

2 голосов
/ 05 августа 2011

Php обрабатывает var довольно свободно, подробнее здесь:

http://php.net/manual/en/language.types.type-juggling.php

1 голос
/ 05 августа 2011

php может автоматически изменять тип (правильно или неправильно в зависимости от того, в каком углу вы стоите), поэтому в большинстве случаев это мало заботит ...

0 голосов
/ 05 августа 2011

AFAIK php преобразует переменные (особенно смешанные) в строку

как например ..

$myArray = array(1,2,3);

если вы выведете $ myArray, это приведет к

Массив

0 голосов
/ 05 августа 2011

Это не значит, что echo меняет тип чего-либо.

echo() - это языковая конструкция, параметры которой будут рассматриваться как строки. Таким образом, он ожидает жало, поскольку каждый параметр передается ему.

PHP на уровне языка, однако, не имеет никаких проблем с типами данных, поскольку это динамический свободно типизированный язык (как Lisp или Perl, и по сравнению со строгой типизацией Python или C).

Итак, даже если (почти) 1 все, что вы говорите, в основном является выражением, каждое из этих предложений имеет возвращаемое значение.

Каждое значение имеет внутренний тип. Скажем, например, что 4 является значением типа integer. Это всегда будет правдой. Таким образом, если вы проверяете целостность типа, isint(4) всегда будет возвращать значение true (типа boolean).

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

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

Допустим, у нас есть выражение "13" . 37. В PHP . является оператором конкатенации строк. "13" является выражением string -типа. Итак, правый оператор . должен быть строкой. Так как это не так, Zend Engine ищет простой способ продвижения целочисленного выражения 37 в строку. Он находит один: строка "37", сгенерированная C printf("%d", value) -подобным выражением.

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

Это особенно верно в таких средах, как:

if     ($anything == 6) { /* Will be triggered also with "6" */ }
elseif (!$anything) { /* will be triggered with the empty string too */ }
elseif (is_string($anything)) { /* will not be triggered with "6" nor "" because of the else */ }
elseif ($anything == true) { /* will be triggered with anything that is not false:
    1, "1", 4, "anything", myObjectInstance(), AND also with the
    string "false", that is promoted to boolean true. (Boolean false is the empty string) */ }

Если вы ищете ASCII-представление байта, используйте chr ()


1 Существуют исключения, такие как конструкция namespace, конструкция declare, это не Лисп: -D

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...