Verification: a143cc29221c9be0

Notice array to string conversion in массив echo php

Notice array to string conversion in массив echo php

Как создать переменную в PHP

Вначале переменные содержат знак $ (доллар) - обозначение использования переменной, потом буквы латинского алфавита (от a до z и маленькие и большие), в конце могу содержать цифры . Также в названии допускается использование нижнего подчёркивания (не в конце).

Как можно называть переменные:

$var
$variable
$year1945
$_variable
Как нельзя называть переменные:

$1 - состоит только из цифры
$1var - нельзя начинать название переменной с цифры
$/var - из дополнительных символов допускается только нижнее подчёркивание _
$переменная - кириллица разрешена документацией php, но не рекомендуема
$var iable - нельзя использовать пробелы

Каждой переменной присваивается значение. Для присвоения значения используется знак = (равно). В течение обработки скрипта значение переменной может неоднократно меняться в зависимости от разных условий.

$city = "Москва"; // переменной $city присвоили строковое (в кавычках) значение Москва
$year = 1147; // а переменной $year присвоили числовое значение 1147
?>

$name = "Александр";
$Name = "Алексей";
echo "$name, $Name"; // выведет "Александр, Алексей"
?>

Вывод переменных PHP

Отдельно следует разобрать то, как отобразить переменные при помощи операторов вывода , работу которых мы разобрали в прошлом уроке Создание странцы PHP. Операторы вывода. . Ниже приведу ряд наглядных примеров с комментариями.

// Так задаём значения переменным
$name1 = "Алексей";
$name2 = "Александр";

// Выводим переменные
echo $name2; // Выведет: Александр
echo "name1 - это $name1"; // name1 - это Алексей

// При использовании одиночных кавычек выводится
// имя переменной, а не значение
echo "name1 - это $name1"; // выведет: name1 - это $name1

// можно вывести просто значения переменных
echo $name1; // Алексей
echo $name1,$name2; // АлексейАлександр
echo $name1." ".$name2; // Алексей Александр
echo "$name1, $name2"; // Алексей, Александр

Echo Здесь используется синтаксис "here document" для вывода
нескольких строк с подстановкой переменных $variable.
END;

Операции с переменными PHP

Арифметические операции в PHP
В случае с числовыми значениями можно проводить арифметические операции: сложение, вычитание, умножение и так далее.

-$a (отрицание) Смена знака $a.
$a + $b (сложение) Сумма $a и $b.
$a - $b (вычитание) Разность $a и $b.
$a * $b (умножение) Произведение $a и $b.
$a / $b (деление) Частное от деления $a на $b.
$a % $b (деление по модулю) Целочисленный остаток от деления $a на $b.
Рассмотрим примеры

$a = 2; // заметьте, в случае с цифрами кавычки не ставятся
$b = 3; // заметьте, в случае с цифрами кавычки не ставятся

$result = $a + $b; // складываем переменные
echo $result; // выведет 5

$result = $b - $a; // складываем переменные
echo $result; // выведет 1

Операции инкремента и декремента в PHP
Данные операции пригодятся в основном при построении циклов, о которых поговорим чуть позже.
Префиксный - операторы, прописанные ПЕРЕД переменной (--$a ; ++$a ). Возвращают значение переменной до изменений.
Постфиксный - операторы, прописываемые после переменной ($a-- ; $a-- ). Возвращают значение переменной с изменениями.
Инкремент - увеличения значения.
Декремент - уменьшение значения.

++$a Префиксный инкремент. Увеличивает $a на единицу и возвращает значение $a.
$a++ Постфиксный инкремент. Возвращает значение $a, а затем увеличивает $a на единицу.
--$a Префиксный декремент. Уменьшает $a на единицу и возвращает значение $a.
$a-- Постфиксный декремент. Возвращает значение $a, а затем уменьшает $a на единицу.
echo "

Постфиксный инкремент

";
$a = 5;
echo "Должно быть 5: " . $a++ . "\n";

Echo "

Префиксный инкремент

";
$a = 5;
echo "Должно быть 6: " . ++$a . "\n";
echo "Должно быть 6: " . $a . "\n";

Echo "

Постфиксный декремент

";
$a = 5;
echo "Должно быть 5: " . $a-- . "\n";

Echo "

Префиксный декремент

";
$a = 5;
echo "Должно быть 4: " . --$a . "\n";
echo "Должно быть 4: " . $a . "\n";
?>

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

$a = ($b = 2) + 4; // результат: $a установлена значением 6, переменной $b присвоено 2.

$a = 2;
$a += 3; // устанавливает $a значением 5, аналогично записи: $a = $a + 3;
$b = "Привет ";
$b .= "Мир!"; // устанавливает $b строкой "Привет Мир!", как и $b = $b . "There!";

Существуют также операции сравнения и логические , но о них мы поговорим в следующих уроках. Постараюсь сразу не пугать Вас большим объёмом информации!)

13 years ago

A little gotcha to watch out for:

If you turn off RegisterGlobals and related, then use get_defined_vars(), you may see something like the following:

Array
[ GLOBALS ] => Array
[ GLOBALS ] => Array
* RECURSION *
[ _POST ] => Array()
[ _GET ] => Array()
[ _COOKIE ] => Array()
[ _FILES ] => Array()
)

[ _POST ] => Array()
[ _GET ] => Array()
[ _COOKIE ] => Array()
[ _FILES ] => Array()

)
?>

Notice that $_SERVER isn"t there. It seems that php only loads the superglobal $_SERVER if it is used somewhere. You could do this:

print "

"
.
htmlspecialchars
(print_r
(get_defined_vars
(),
true
)) .
"

" ;
print "

"
.
htmlspecialchars
(print_r
($_SERVER
,
true
)) .
"

" ;
?>

And then $_SERVER will appear in both lists. I guess it"s not really a gotcha, because nothing bad will happen either way, but it"s an interesting curiosity nonetheless.

6 years ago

Since get_defined_vars() only gets the variables at the point you call the function, there is a simple way to get the variables defined within the current scope.

// The very top of your php script
$vars = get_defined_vars ();

// Now do your stuff
$foo = "foo" ;
$bar = "bar" ;

// Get all the variables defined in current scope
$vars = array_diff (get_defined_vars (), $vars );

echo "

"
;
print_r ($vars );
echo "

" ;
?>

15 years ago

Here is a function which generates a debug report for display or email
using get_defined_vars. Great for getting a detailed snapshot without
relying on user input.

function generateDebugReport ($method , $defined_vars , $email = "undefined" ){
// Function to create a debug report to display or email.
// Usage: generateDebugReport(method,get_defined_vars(),email);
// Where method is "browser" or "email".

// Create an ignore list for keys returned by "get_defined_vars".
// For example, HTTP_POST_VARS, HTTP_GET_VARS and others are
// redundant (same as _POST, _GET)
// Also include vars you want ignored for security reasons - i.e. PHPSESSID.
$ignorelist =array("HTTP_POST_VARS" , "HTTP_GET_VARS" ,
"HTTP_COOKIE_VARS" , "HTTP_SERVER_VARS" ,
"HTTP_ENV_VARS" , "HTTP_SESSION_VARS" ,
"_ENV" , "PHPSESSID" , "SESS_DBUSER" ,
"SESS_DBPASS" , "HTTP_COOKIE" );

$timestamp = date ("m/d/y h:m:s" );
$message = "Debug report created $timestamp \n" ;

// Get the last SQL error for good measure, where $link is the resource identifier
// for mysql_connect. Comment out or modify for your database or abstraction setup.
global $link ;
$sql_error = mysql_error ($link );
if($sql_error ){
$message .= "\nMysql Messages:\n" . mysql_error ($link );
}
// End MySQL

// Could use a recursive function here. You get the idea ;-)
foreach($defined_vars as $key => $val ){
if(is_array ($val ) && ! in_array ($key , $ignorelist ) && count ($val ) > 0 ){
$message .= "\n $key array (key=value):\n" ;
foreach($val as $subkey => $subval ){
if(! in_array ($subkey , $ignorelist ) && ! is_array ($subval )){
$message .= $subkey . " = " . $subval . "\n" ;
}
elseif(! in_array ($subkey , $ignorelist ) && is_array ($subval )){
foreach($subval as $subsubkey => $subsubval ){
if(! in_array ($subsubkey , $ignorelist )){
$message .= $subsubkey . " = " . $subsubval . "\n" ;
}
}
}
}
}
elseif(!
is_array ($val ) && ! in_array ($key , $ignorelist ) && $val ){
$message .= "\nVariable " . $key . " = " . $val . "\n" ;
}
}

If($method == "browser" ){
echo nl2br ($message );
}
elseif($method == "email" ){
if($email == "undefined" ){
$email = $_SERVER [ "SERVER_ADMIN" ];
}

$mresult = mail ($email , "Debug Report for " . $_ENV [ "HOSTNAME" ]. "" , $message );
if($mresult == 1 ){
echo "Debug Report sent successfully.\n" ;
}
else{
echo "Failed to send Debug Report.\n" ;
}
}
}
?>

17 years ago

Simple routine to convert a get_defined_vars object to XML.

function obj2xml ($v , $indent = "" ) {
while (list($key , $val ) = each ($v )) {
if ($key == "__attr" ) continue;
// Check for __attr
if (is_object ($val -> __attr )) {
while (list($key2 , $val2 ) = each ($val -> __attr )) {
$attr .= " $key2 =\" $val2 \"" ;
}
}
else $attr = "" ;
if (is_array ($val ) || is_object ($val )) {
print(" $indent \n" );
obj2xml ($val , $indent . " " );
print(" $indent $key >\n" );
}
else print(" $indent $val $key >\n" );
}
}

//Example object
$x -> name -> first = "John" ;
$x -> name -> last = "Smith" ;
$x -> arr [ "Fruit" ] = "Bannana" ;
$x -> arr [ "Veg" ] = "Carrot" ;
$y -> customer = $x ;
$y -> customer -> __attr -> id = "176C4" ;

$z = get_defined_vars ();
obj2xml ($z [ "y" ]);
?>
will output:


John
Smith


Bannana
Carrot

11 years ago

As a note, get_defined_vars() does not return a set of variable references (as I hoped). For example:

// define a variable
$my_var = "foo" ;

// get our list of defined variables
$defined_vars = get_defined_vars ();

// now try to change the value through the returned array
$defined_vars [ "my_var" ] = "bar" ;

echo $my_var , "\n" ;

?>

will output "foo" (the original value). It"d be nice if get_defined_vars() had an optional argument to make them references, but I imagine its a rather specialized request. You can do it yourself (less conveniently) with something like:

$defined_vars = array();
$var_names = array_keys (get_defined_vars ());

foreach ($var_names as $var_name )
{
$defined_vars [ $var_name ] =& $ $var_name ;
}

?>

1 year ago

I posted here before about "this" being in get_defined_vars.

It turns out it"s not always there but in certain cases it will inexplicably appear.

Php -r "
class Test {
public function a() {var_dump(array_keys(get_defined_vars()));$a = 123;}
public function b() {var_dump(array_keys(get_defined_vars()));$this;}
}
$t = new Test();
$t->a();
$t->b();
"

Array()
array("this")

This does not happen in PHP 7.2 but will happen in PHP 5.6.

1 year ago

Some comments here point out that this function wont return references. It does however return names and names are "references".

I would not recommend the suggestions here that convert it to references.

Public function x($a, $b, $c) {
foreach(array_keys(get_defined_vars()) as $key)
if($key !== "this")
$this->y(${$key});
}

Public function y(&$input) {
$input++;
}

Instead of ${} you can also use $$.

I have done some whacky things in my time to make extremely generic code but I"ve never had to do anything like the above. It might not even work (but should since it"s no different to $a[$key]).

You could also do $$key++ but I"ve never seen code like that which wasn"t horrifically bad (using dynamic where dynamic isn"t beneficial).

If you"re doing something like that then give it additional scrutiny.

Переменные окружения (среды) в Windows содержат различную информацию о настройках системы и среды пользователя. Различают переменные окружения пользователя, системы и процессов.

Самый простой способ просмотреть содержимое переменных окружения в Windows – открыть свойства системы (sysdm.cpl) -> Дополнительно -> Переменные среды. Как вы видите, в открывшемся есть две секции: в верхней содержатся переменные окружения пользователя, в нижнем – системные.

Кроме того, переменные среды хранятся в реестре системы. Пользовательские переменные хранятся в разделе . Системные – в HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment .

Вывести значения всех переменных окружения можно в командной строке Windows. Команда простая:

Команда выведет список переменных среды и их значения.

В PowerShell для вывод всех переменных окружения можно использовать команду:

Если нужно вывести значение только одной переменной, нужно воспользоваться командой echo, причем имя переменной нужно заключить в знаки процентов. Например,

Echo %systemroot%

set > c:\tmp\env_var.txt

Переменные окружения конкретного процесса можно получить с помощью бесплатной утилиты Process Explorer (от Sysinternals). Достаточно открыть свойства процесса и перейти на вкладку Environment .

Наверняка у вас дома есть шкаф или комод. Принцип их использования простой: мы убираем туда вещи, которые не нужны нам прямо сейчас, но могут понадобиться через некоторое время.

Переменные устроены точно также. В них можно положить какое-нибудь значение и хранить там, пока оно не понадобится.

Создание переменных

Положить значение в переменную можно следующим образом:

В коде выше мы создали переменную $name и положили в неё значение Иван , затем создали переменную $age и присвоили ей значение 20 .

Название "переменная" означает, что её значение может меняться во время выполнения скрипта:

В некоторых языках переменную нужно сначала "объявить", а затем уже использовать. В PHP объявления нет - переменная создаётся в тот момент, когда вы кладёте в неё значение.
Тем не менее, PHP-программисты часто говорят "объявить переменную" вместо "создать переменную".

Также вместо "положить в переменную значение" часто говорят "присвоить значение".
Причина проста - символ = , благодаря которому мы сохраняем значение в переменную, называется "оператор присваивания". Отсюда и термин "присвоить".

Правила именования переменных

1. Название переменной начинается с символа $.

2. Вторым символом может быть буква или символ подчёркивания _

Названия переменных регистрозависимы. $name и $Name - это разные переменные.

Вывод значения переменной на экран

Вывести переменную можно с помощью уже известной нам команды echo :

Команда echo позволяет вывести на экран сразу несколько значений:

Заметьте, мы передали в echo 2 значения, разделив их запятой. Так мы можем передавать сколько угодно значений. Следующие два примера приведут к одинаковому результату:

Также в PHP существует сокращённый синтаксис вывода переменных. Вместо

До версии PHP 5.4 сокращённый синтаксис работал только при включении в настройках PHP директивы short_open_tag , которая также позволяет использовать сокращённый открывающий тег наравне с

Проверка значения переменной

Команда echo не всегда удобна для проверки текущего значения переменной. К примеру, при попытке вывода пустой строки "" на экран не выведется абсолютно ничего. И непонятно, в чём причина - в пустой переменной или неработающем коде.

Поэтому для проверки значения переменной используется функция var_dump() :

Результат выполнения скрипта:

String(5) "Vasya" string(0) ""

Как видите, PHP вывел не только содержимое переменной, но ещё и количество символов, и даже тип переменной (string - строка). Типы данных мы подробно рассмотрим на следующих уроках.

Удаление переменных

Удалить существующую переменную можно с помощью функции unset() :

А теперь пришло время немного попрактиковаться.

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

Напишите скрипт, который:
1. Создаёт переменные с названиями title и content и какими-нибудь значениями.
2. Выводит значение переменной title внутри тега h1, а значение переменной content внутри тега div.

Показать решение

", $title, ""; echo "

", $content, "

"; ?>

Хочу ещё раз обратить ваше внимание, что это решение не является единственно верным. К примеру, следующий код приведёт к такому же результату:

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

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

Что такое область видимости?

Область видимости переменных - это контекст, в рамках которого переменная была определена и где к ней можно получить доступ. В PHP имеется две области видимости переменных:

  • Глобальная - к переменным можно получить доступ в любом месте скрипта
  • Локальная - к переменным можно получить доступ только внутри функции, в которой они были определены

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

Переменные с глобальной областью видимости называются глобальными, а с локальной областью видимости - локальными.

Вот пример того, как работают глобальные и локальные переменные.

"; } sayHello(); echo "Значение \$globalName: "$globalName"
"; echo "Значение \$localName: "$localName"
"; ?>

Привет, Гарри! Значение $globalName: "Зоя" Значение $localName: ""

В данном скрипте мы создали две переменных:

  • $globalName - это глобальная переменная
  • $localName - это локальная переменная, которая создана внутри функции sayHello() .

После создания переменной и функции скрипт вызывает sayHello() ,который выводит "Привет, Гарри!" . Затем скрипт пытается вывести значения двух переменных с помощью функции echo . Вот что происходит:

  • Так как $globalName была создана вне функции, она доступна в любом месте скрипта, поэтому выводится "Зоя" .
  • $localName будет доступна только внутри функции sayHello() . Так как выражение echo находится вне функции, PHP не дает доступа к локальной переменной. Вместо этого, PHP предполагает, что код будет создавать новую переменную с именем $localName , которая получит значение по умолчанию - пустую строку. вот почему второй вызов echo выводит значение "" для переменной $localName .

Доступ к глобальным переменным внутри функции

Для получения доступа к глобальной переменной вне функции достаточно просто написать ее имя. Но для получения доступа к глобальной переменной внутри функции , нужно сначала объявить переменную как глобальную в функции с помощью ключевого слова global:

Function myFunction() { global $globalVariable; // Доступ к глобальной переменной $globalVariable }

Если не сделать этого, то PHP предполагает, что вы создаете или используете локальную переменную.

Вот пример скрипта, который использует глобальную переменную внутри функции:

"; global $globalName; echo "Привет, $globalName!
"; } sayHello(); ?>

При выполнении скрипт выведет:

Привет, Гарри! Привет, Зоя!

Функция sayHello() использует ключевое слово global для объявления переменной $globalName как глобальной. После чего она может получить доступ к переменной и вывести ее значение ("Зоя").

Синтаксис

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

Одинарные кавычки

Простейший способ определить строку - это заключить ее в одинарные кавычки (символ ").

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

Замечание: В PHP 3 в данном случае будет выдано сообщение уровня E_NOTICE.

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

Echo "это простая строка"; echo "Также вы можете вставлять в строки символ новой строки таким образом, поскольку это нормально"; // Выведет: Однажды Арнольд сказал: "I"ll be back" echo "Однажды Арнольд сказал: "I\"ll be back""; // Выведет: Вы удалили C:\*.*? echo "Вы удалили C:\\*.*?"; // Выведет: Вы удалили C:\*.*? echo "Вы удалили C:\*.*?"; // Выведет: Это не вставит: \n новую строку echo "Это не вставит: \n новую строку"; // Выведет: Переменные $expand также $either не подставляются echo "Переменные $expand также $either не подставляются";

Двойные кавычки

Если строка заключена в двойные кавычки ("), PHP распознает большее количество управляющих последовательностей для специальных символов:

Таблица 11-1. Управляющие последовательности

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

Но самым важным свойством строк в двойных кавычках является обработка переменных. Смотрите более подробно: обработка строк.

Heredoc

Другой способ определения строк - это использование heredoc-синтаксиса ("

Закрывающий идентификатор должен начинаться в первом столбце строки. Кроме того, идентификатор должен соответствовать тем же правилам именования, что и все остальные метки в PHP: содержать только буквенно-цифровые символы и знак подчеркивания, и должен начинаться с нецифры или знака подчеркивания.

Внимание

Очень важно отметить, что строка с закрывающим идентификатором не содержит других символов, за исключением, возможно, точки с запятой (;). Это означает, что идентификатор не должен вводиться с отступом и что не может быть никаких пробелов или знаков табуляции до или после точки с запятой. Важно также понимать, что первым символом перед закрывающим идентификатором должен быть символ новой строки, определенный в вашей операционной системе. Например, на Macintosh это \r.

Если это правило нарушено и закрывающий идентификатор не является "чистым", считается, что закрывающий идентификатор отсутствует и PHP продолжит его поиск дальше. Если в этом случае верный закрывающий идентификатор так и не будет найден, то это вызовет ошибку в обработке с номером строки в конце скрипта.

Heredoc-текст ведет себя так же, как и строка в двойных кавычках, при этом их не имея. Это означает, что вам нет необходимости экранировать кавычки в heredoc, но вы по-прежнему можете использовать вышеперечисленные управляющие последовательности. Переменные обрабатываются, но с применением сложных переменных внутри heredoc нужно быть также внимательным, как и при работе со строками.

Пример 11-2. Пример определения heredoc-строки

$str = foo = "Foo"; $this->bar = array("Bar1", "Bar2", "Bar3"); } } $foo = new foo(); $name = "МоеИмя"; echo foo. Теперь я вывожу {$foo->bar}. Это должно вывести заглавную букву "A": \x41 EOT;

Замечание: Поддержка heredoc была добавлена в PHP 4.

Обработка переменных

Если строка определяется в двойных кавычках, либо при помощи heredoc, переменные внутри нее обрабатываются.

Существует два типа синтаксиса: простой и сложный. Простой синтаксис более легок и удобен. Он дает возможность обработки переменной, значения массива (array) или свойства объекта (object).

Сложный синтаксис был введен в PHP 4 и может быть распознан по фигурным скобкам, окружающих выражение.

Простой синтаксис

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

$beer = "Heineken"; echo "$beer"s taste is great"; // работает, """ это неверный символ для имени переменной echo "He drank some $beers"; // не работает, "s" это верный символ для имени переменной echo "He drank some ${beer}s"; // работает echo "He drank some {$beer}s"; // работает

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

// Эти примеры специфически об использовании массивов внутри // строк. Вне строк всегда заключайте строковые ключи вашего // массива в кавычки и не используйте вне строк {скобки}. // Давайте покажем все ошибки error_reporting(E_ALL); $fruits = array("strawberry" => "red", "banana" => "yellow"); // Работает, но заметьте, что вне кавычек строки это работает по-другому echo "A banana is $fruits."; //Работает echo "A banana is {$fruits["banana"]}."; // Работает, но PHP, как описано ниже, сначала ищет // константу banana. echo "A banana is {$fruits}."; // Не работает, используйте фигурные скобки. Это вызовет ошибку обработки. echo "A banana is $fruits["banana"]."; // Работает echo "A banana is " . $fruits["banana"] . "."; // Работает echo "This square is $square->width meters broad."; // Не работает. Для решения см. сложный синтаксис. echo "This square is $square->width00 centimeters broad.";

Для чего-либо более сложного вы должны использовать сложный синтаксис.

Сложный (фигурный) синтаксис

Он называется сложным не потому, что труден в понимании, а потому что позволяет использовать сложные выражения.

Фактически, вы можете включить любое значение, находящееся в пространстве имени в строке с этим синтаксисом. Вы просто записываете выражение таким же образом, как и вне строки, а затем заключаете его в { и }. Поскольку вы не можете экранировать "{", этот синтаксис будет распознаваться только когда $ следует непосредственно за {. (Используйте "{\$" или "\{$" чтобы отобразить "{$"). Несколько поясняющих примеров:

// Давайте покажем все ошибки error_reporting(E_ALL); $great = "fantastic"; // Не работает, выведет: This is { fantastic} echo "This is { $great}"; // Работает, выведет: This is fantastic echo "This is {$great}"; echo "This is ${great}"; // Работает echo "Этот квадрат шириной {$square->width}00 сантиметров."; // Работает echo "Это работает: {$arr}"; // Это неверно по той же причине, что и $foo неверно вне // строки. Другими словами, это по-прежнему будет работать, // но поскольку PHP сначала ищет константу foo, это вызовет // ошибку уровня E_NOTICE (неопределенная константа). echo "Это неправильно: {$arr}"; // Работает. При использовании многомерных массивов, внутри // строк всегда используйте фигурные скобки echo "Это работает: {$arr["foo"]}"; // Работает. echo "Это работает: " . $arr["foo"]; echo "Вы даже можете записать {$obj->values->name}"; echo "Это значение переменной по имени $name: {${$name}}";

Доступ к символу в строке и его изменение

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

Замечание: Для обеспечения обратной совместимости, вы по-прежнему имеете возможность использовать в тех же целях скобки массива. Однако, начиная с PHP 4, этот синтаксис нежелателен к использованию.

Пример 11-3. Несколько примеров строк

// Получение первого символа строки $str = "Это тест."; $first = $str{0}; // Получение третьего символа строки $third = $str{2}; // Получение последнего символа строки $str = "Это все еще тест."; $last = $str{strlen($str)-1}; // Изменение последнего символа строки $str = "Посмотри на море"; $str{strlen($str)-1} = "я";

Полезные функции и операторы

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

Для модификации строк существует множество полезных функций.

Основные функции описаны в разделе строковых функций, функции регулярных выражений для расширенного поиска и замены (в двух частях: Perl и POSIX расширенный).

Также существуют функции для URL-строк, и функции для шифрования/дешифрования строк (mcrypt и mhash).

Наконец, если вы все еще не нашли, что искали, смотрите также функции для символьного типа.

Преобразование в строку

Вы можете преобразовать значение в строку, используя приведение (string), либо функцию strval() . В выражениях, где необходима строка, преобразование происходит автоматически. Это происходит, когда вы используете функции echo() или print() , либо когда вы сравниваете значение переменной со строкой. Прочтение разделов руководства Типы и Манипуляции с типами сделает следующее более понятным. Смотрите также settype() .

Булево (boolean) значение TRUE преобразуется в строку "1", а значение FALSE представляется как "" (пустая строка). Этим способом вы можете преобразовывать значения в обе стороны - из булева типа в строковый и наоборот.

Целое (integer) или число с плавающей точкой (float) преобразуется в строку, представленную числом, состоящим из его цифр (включая показатель степени для чисел с плавающей точкой).

Массивы всегда преобразуются в строку "Array", так что вы не можете отобразить содержимое массива (array), используя echo() или print() , чтобы узнать, что он содержит. Чтобы просмотреть один элемент, вам нужно сделать что-то вроде echo $arr["foo"]. Смотрите ниже советы о том, как отобразить/просмотреть все содержимое.

Объекты всегда преобразуются в строку "Object". Если вы хотите вывести значение переменной-члена объекта (object) с целью отладки, прочтите следующие абзацы. Если вы хотите получить имя класса требуемого объекта, используйте get_class() .

Ресурсы всегда преобразуются в строки со структурой "Resource id #1", где 1 - это уникальный номер ресурса (resource), присвоенный ему PHP во время выполнения. Если вы хотите получить тип ресурса, используйте .

NULL всегда преобразуется в пустую строку.

Как вы могли видеть выше, вывод массивов, объектов или ресурсов не предоставляет вам никакой полезной информации о самих значениях. Более подходящий способ вывода значений для отладки - использовать функции print_r() и var_dump() .

Вы также можете преобразовать значения PHP в строки для постоянного хранения. Этот метод называется сериализацией и может быть выполнен при помощи функции serialize() . Кроме того, если в вашей установке PHP есть поддержка WDDX, вы можете сериализовать значения PHP в структуры XML.

Преобразование строк в числа

Если строка распознается как числовое значение, результирующее значение и тип определяется так как показано далее.

Строка будет распознана как float, если она содержит любой из символов ".", "e", или "E". Иначе она будет определена как целое.

Значение определяется по начальной части строки. Если строка начинается с верного числового значения, будет использовано это значение. Иначе значением будет 0 (ноль). Верное числовое значение - это одна или более цифр (могущих содержать десятичную точку), по желанию предваренных знаком, с последующим необязательным показателем степени. Показатель степени - это "e" или "E" с последующими одной или более цифрами.

$foo = 1 + "10.5"; // $foo это float (11.5) $foo = 1 + "-1.3e3"; // $foo это float (-1299) $foo = 1 + "bob-1.3e3"; // $foo это integer (1) $foo = 1 + "bob3"; // $foo это integer (1) $foo = 1 + "10 Small Pigs"; // $foo это integer (11) $foo = 4 + "10.2 Little Piggies"; // $foo это float (14.2) $foo = "10.0 pigs " + 1; // $foo это float (11) $foo = "10.0 pigs " + 1.0; // $foo это float (11)

Более подробную информацию об этом преобразовании смотрите в разделе о strtod(3) документации Unix.

Если вы хотите протестировать любой из примеров этого раздела, вы можете скопировать и вставить его и следующую строку, чтобы увидеть, что происходит:

Echo "\$foo==$foo; тип: " . gettype ($foo) . "
\n";

Не ожидайте получить код символа, преобразовав его в целое (как вы могли бы сделать, например, в C). Для преобразования символов в их коды и обратно используйте функции ord() и

Я не эксперт в программировании на PHP, но меня немного смущает, почему я вижу некоторый код в PHP со строкой, заключенной в одинарные, а иногда и в двойные кавычки.

Я просто знаю, что в.NET или языке Си, если он в одинарных кавычках, это означает, что это символ, а не строка.

Решение

То, что вы должны знать,

$a = "name"; $b = "my $a"; == "my name" $c = "my $a"; != "my name"

В PHP люди используют одинарные кавычки для определения постоянной строки, например "a" , "my name" , "abc xyz" при использовании двойной кавычки для определения строки, содержащей идентификатор, такой как "a $b $c $d" ,

И другое дело,

Echo "my name";

быстрее чем

Echo "my name";

Echo "my " . $a;

медленнее, чем

Echo "my $a";

Это верно для других используемых строк.

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

$test = "variable"; echo "Hello Mr $test"; // the output would be: Hello Mr variable echo "Hello Mr $test"; // the output would be: Hello Mr $test

Здесь двойная кавычка анализирует значение, а одинарная кавычка рассматривается как строковое значение (без разбора переменной $ test.)

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

Замечание : В PHP 7.0.0 на 64-битных платформах нет каких-либо достижимых ограничений для длины строки, в 32-битных системах и в более ранних версиях PHP, строки не могут быть более 2 ГБ (2147483647 байт).

Синтаксис

Строка может быть определена четырьмя различными способами:

  • одинарными кавычками
  • двойными кавычками
  • nowdoc-синтаксисом (начиная с PHP 5.3.0)

Одинарные кавычки

Простейший способ определить строку - это заключить ее в одинарные кавычки (символ " ).

Чтобы использовать одинарную кавычку внутри строки, проэкранируйте ее обратным слешем (\ ). Если необходимо написать сам обратный слеш, продублируйте его (\\ ). Все остальные случаи применения обратного слеша будут интерпретированы как обычные символы: это означает, что если вы попытаетесь использовать другие управляющие последовательности, такие как \r или \n , они будут выведены как есть вместо какого-либо особого поведения.

echo "это простая строка" ;

echo "Также вы можете вставлять в строки
символ новой строки вот так,
это нормально"
;

// Выводит: Однажды Арнольд сказал: "I"ll be back"
echo "Однажды Арнольд сказал: "I\"ll be back"" ;

Echo "Вы удалили C:\\*.*?" ;

// Выводит: Вы удалили C:\*.*?
echo "Вы удалили C:\*.*?" ;

// Выводит: Это не будет развернуто: \n новая строка
echo "Это не будет развернуто: \n новая строка" ;

// Выводит: Переменные $expand также $either не разворачиваются
echo "Переменные $expand также $either не разворачиваются" ;
?>

Двойные кавычки

Если строка заключена в двойные кавычки ("), PHP распознает следующие управляющие последовательности специальных символов:

Управляющие последовательности
Последовательность Значение
\n новая строка (LF или 0x0A (10) в ASCII)
\r возврат каретки (CR или 0x0D (13) в ASCII)
\t горизонтальная табуляция (HT или 0x09 (9) в ASCII)
\v вертикальная табуляция (VT или 0x0B (11) в ASCII) (с PHP 5.2.5)
\e escape-знак (ESC или 0x1B (27) в ASCII) (с PHP 5.4.4)
\f подача страницы (FF или 0x0C (12) в ASCII) (с PHP 5.2.5)
\\ обратная косая черта
\$ знак доллара
\" двойная кавычка
\{1,3} последовательность символов, соответствующая регулярному выражению символа в восьмеричной системе счисления, который молча переполняется, чтобы поместиться в байт (т.е. "\400" === "\000")
\x{1,2} последовательность символов, соответствующая регулярному выражению символа в шестнадцатеричной системе счисления
\u{+} последовательность символов, соответствующая регулярному выражению символа Unicode, которая отображается в строка в представлении UTF-8 (добавлено в PHP 7.0.0)

Как и в строке, заключенной в одинарные кавычки, экранирование любого символа выведет также и сам символ экранирования. До версии PHP 5.1.1, обратный слеш в \{$var} не печатался.

Heredoc

Третий способ определения строк - это использование heredoc-синтаксиса: . После этого оператора необходимо указать идентификатор, затем перевод строки. После этого идет сама строка, а потом этот же идентификатор, закрывающий вставку.

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

Внимание

Очень важно отметить, что строка с закрывающим идентификатором не должна содержать других символов, за исключением точки с запятой (; ). Это означает, что идентификатор не должен вводиться с отступом и что не может быть никаких пробелов или знаков табуляции до или после точки с запятой. Важно также понимать, что первым символом перед закрывающим идентификатором должен быть символ новой строки, определенный в вашей операционной системе. Например, в UNIX системах, включая macOS, это \n . После закрывающего идентификатора также сразу должна начинаться новая строка.

Если это правило нарушено и закрывающий идентификатор не является "чистым", считается, что закрывающий идентификатор отсутствует и PHP продолжит его поиск дальше. Если в этом случае верный закрывающий идентификатор так и не будет найден, то это вызовет ошибку парсинга с номером строки в конце скрипта.

Пример #1 Пример неправильного синтаксиса

class foo {
public $bar = bar
EOT;
// отступ перед закрывающим идентификатором недопустим
}
?>

Пример #2 Пример правильного синтаксиса

class foo {
public $bar = bar
EOT;
}
?>

Heredoc не может быть использован для инициализации полей класса. Начиная с версии PHP 5.3, это ограничение распространяется только на heredoc, содержащие внутри себя переменные.

Heredoc-текст ведет себя так же, как и строка в двойных кавычках, при этом их не имея. Это означает, что вам нет необходимости экранировать кавычки в heredoc, но вы по-прежнему можете использовать вышеперечисленные управляющие последовательности. Переменные обрабатываются, но с применением сложных переменных внутри heredoc нужно быть также внимательным, как и при работе со строками.

Пример #3 Пример определения heredoc-строки

$str = Пример строки,
охватывающей несколько строк,
с использованием heredoc-синтаксиса.
EOD;

Class foo
{
var $foo ;
var $bar ;

Function __construct ()
{
$this -> foo = "Foo" ;
$this ->
}
}

$foo = new foo ();
$name = "Имярек" ;

echo Меня зовут " $name ". Я печатаю $foo -> foo .
Теперь я вывожу
{ $foo -> bar [ 1 ]} .
Это должно вывести заглавную букву "A": \x41
EOT;
?>

Меня зовут "Имярек". Я печатаю Foo. Теперь, я вывожу Bar2. Это должно вывести заглавную букву "A": A

Также возможно использовать heredoc-синтаксис для передачи данных через аргументы функции:

Начиная с версии 5.3.0, стала возможной инциализация статических переменных и свойств/констант класса с помощью синтаксиса heredoc:

Пример #5 Использование heredoc для инциализации статических переменных

// Статические переменные
function foo ()
{
static $bar = Здесь ничего нет...
LABEL;
}

// Константы/свойства класса
class foo
{
const BAR = Пример использования константы
FOOBAR;

Public $baz = Пример использования поля
FOOBAR;
}
?>

Начиная с PHP 5.3.0, можно также окружать идентификатор Heredoc двойными кавычками:

Nowdoc

Nowdoc - это то же самое для строк в одинарных кавычках, что и heredoc для строк в двойных кавычках. Nowdoc похож на heredoc, но внутри него не осуществляется никаких подстановок . Эта конструкция идеальна для внедрения PHP-кода или других больших блоков текста без необходимости его экранирования. В этом он немного похож на SGML-конструкцию тем, что объявляет блок текста, не предназначенный для обработки.

Nowdoc указывается той же последовательностью , что используется в heredoc, но последующий за ней идентификатор заключается в одинарные кавычки, например, . Все условия, действующие для идентификаторов heredoc также действительны и для nowdoc, особенно те, что относятся к закрывающему идентификатору.

Пример #7 Пример использования nowdoc

echo Пример текста,
занимающего несколько строк,
с помощью синтаксиса nowdoc. Обратные слеши всегда обрабатываются буквально,
например, \\ и \".
EOD;

Результат выполнения данного примера:

Пример текста, занимающего несколько строк, с помощью синтаксиса nowdoc. Обратные слеши всегда обрабатываются буквально, например, \\ и \".

Пример #8 Nowdoc string quoting example with variables

/* Более сложный пример с переменными. */
class foo
{
public $foo ;
public $bar ;

Function __construct ()
{
$this -> foo = "Foo" ;
$this -> bar = array("Bar1" , "Bar2" , "Bar3" );
}
}

$foo = new foo ();
$name = "Имярек" ;

echo Меня зовут "$name". Я печатаю $foo->foo.
Теперь я печатаю {$foo->bar}.
Это не должно вывести заглавную "A": \x41
EOT;
?>

Результат выполнения данного примера:

Меня зовут "$name". Я печатаю $foo->foo. Теперь я печатаю {$foo->bar}. Это не должно вывести заглавную "A": \x41

Пример #9 Пример использования статичных данных

class foo {
public $bar = bar
EOT;
}
?>

Замечание :

Поддержка nowdoc была добавлена в PHP 5.3.0.

Обработка переменных

Если строка указывается в двойных кавычках, либо при помощи heredoc, переменные внутри нее обрабатываются.

Существует два типа синтаксиса: простой и сложный . Простой синтаксис более легок и удобен. Он дает возможность обработки переменной, значения массива (array ) или свойства объекта (object ) с минимумом усилий.

Сложный синтаксис может быть определен по фигурным скобкам, окружающим выражение.

Простой синтаксис

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

$juice = "apple" ;

echo "He drank some $juice juice." . PHP_EOL ;

// Некорректно. "s" - верный символ для имени переменной, но переменная имеет имя $juice.
echo "He drank some juice made of $juices ." ;

// Корректно. Строго указан конец имени переменной с помощью скобок:
echo "He drank some juice made of ${ juice } s." ;
?>

Результат выполнения данного примера:

He drank some apple juice. He drank some juice made of . He drank some juice made of apples.

Аналогично могут быть обработаны элемент массива (array ) или свойство объекта (object ). В индексах массива закрывающая квадратная скобка (] ) обозначает конец определения индекса. Для свойств объекта применяются те же правила, что и для простых переменных.

Пример #10 Пример простого синтаксиса

define ("KOOLAID" , "koolaid1" );
$juices = array("apple" , "orange" , "koolaid1" => "purple" );

echo "He drank some $juices [ 0 ] juice." . PHP_EOL ;
echo "He drank some $juices [ 1 ] juice." . PHP_EOL ;
echo "He drank some $juices [ koolaid1 ] juice." . PHP_EOL ;

class people {
public $john = "John Smith" ;
public $jane = "Jane Smith" ;
public $robert = "Robert Paulsen" ;

Public $smith = "Smith" ;
}

$people = new people ();

echo " $people -> john drank some $juices [ 0 ] juice." . PHP_EOL ;
echo " $people -> john then said hello to $people -> jane ." . PHP_EOL ;
echo " $people -> john "s wife greeted $people -> robert ." . PHP_EOL ;
echo " $people -> robert greeted the two $people -> smiths ." ; // Не сработает
?>

Результат выполнения данного примера:

He drank some apple juice. He drank some orange juice. He drank some purple juice. John Smith drank some apple juice. John Smith then said hello to Jane Smith. John Smith"s wife greeted Robert Paulsen. Robert Paulsen greeted the two .

В PHP 7.1.0 добавлена поддержка отрицательных числовых индексов.

Пример #11 Отрицательные числовые индексы

$string = "string" ;
echo "Символ с индексом -2 равен $string [- 2 ] ." , PHP_EOL ;
$string [- 3 ] = "o" ;
echo "Изменение символа на позиции -3 на "o" дает следующую строку: $string ." , PHP_EOL ;
?>

Результат выполнения данного примера:

Символ с индексом -2 равен n. Изменение символа на позиции -3 на "o" дает следующую строку: strong

Для чего-либо более сложного, используйте сложный синтаксис.

Сложный (фигурный) синтаксис

Он называется сложным не потому, что труден в понимании, а потому что позволяет использовать сложные выражения.

Любая скалярная переменная, элемент массива или свойство объекта, отображаемое в строку, может быть представлена в строке этим синтаксисом. Просто запишите выражение так же, как и вне строки, а затем заключите его в { и } . Поскольку { не может быть экранирован, этот синтаксис будет распознаваться только когда $ следует непосредственно за { . Используйте {\$ , чтобы напечатать {$ . Несколько поясняющих примеров:

// Показываем все ошибки
error_reporting (E_ALL );

$great = "здорово" ;

// Не работает, выводит: Это { здорово}
echo "Это { $great }" ;

// Работает, выводит: Это здорово
echo "Это { $great } " ;

// Работает
echo "Этот квадрат шириной { $square -> width } 00 сантиметров." ;

// Работает, ключи, заключенные в кавычки, работают только с синтаксисом фигурных скобок
echo "Это работает: { $arr [ "key" ]} " ;

// Работает
echo "Это работает: { $arr [ 4 ][ 3 ]} " ;

// Это неверно по той же причине, что и $foo вне
// строки. Другими словами, это по-прежнему будет работать,
// но поскольку PHP сначала ищет константу foo, это вызовет
// ошибку уровня E_NOTICE (неопределенная константа).
echo "Это неправильно: { $arr [ foo ][ 3 ]} " ;

// Работает. При использовании многомерных массивов внутри
// строк всегда используйте фигурные скобки
echo "Это работает: { $arr [ "foo" ][ 3 ]} " ;

// Работает.
echo "Это работает: " . $arr [ "foo" ][ 3 ];

echo "Это тоже работает: { $obj -> values [ 3 ]-> name } " ;

echo "Это значение переменной по имени $name : {${ $name }} " ;

echo "Это значение переменной по имени, которое возвращает функция getName(): {${ getName ()}} " ;

echo "Это значение переменной по имени, которое возвращает \$object->getName(): {${ $object -> getName ()}} " ;

// Не работает, выводит: Это то, что возвращает getName(): {getName()}
echo "Это то, что возвращает getName(): {getName()}" ;
?>

С помощью этого синтаксиса также возможен доступ к свойствам объекта внутри строк.

class foo {
var $bar = "I am bar." ;
}

$foo = new foo ();
$bar = "bar" ;
$baz = array("foo" , "bar" , "baz" , "quux" );
echo " { $foo -> $bar } \n" ;
echo " { $foo ->{ $baz [ 1 ]}} \n" ;
?>

Результат выполнения данного примера:

I am bar. I am bar.

Замечание :

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

// Показываем все ошибки
error_reporting (E_ALL );

class beers {
const softdrink = "rootbeer" ;
public static $ale = "ipa" ;
}

$rootbeer = "A & W" ;
$ipa = "Alexander Keith\"s" ;

// Это работает, выводит: Я бы хотел A & W
echo "Я бы хотел {${ beers :: softdrink }} \n" ;

// Это тоже работает, выводит: Я бы хотел Alexander Keith"s
echo "Я бы хотел {${ beers :: $ale }} \n" ;
?>

Доступ к символу в строке и его изменение

Символы в строках можно использовать и модифицировать, определив их смещение относительно начала строки, начиная с нуля, в квадратных скобках после строки, например, $str . Думайте о строке для этой цели, как о массиве символов. Если нужно получить или заменить более 1 символа, можно использовать функции substr() и substr_replace() .

Замечание : начиная с PHP 7.1.0, поддерживаются отрицательные значения смещения. Они задают смещение с конца строки. Ранее отрицательные смещение вызывали ошибку уровня E_NOTICE при чтении (возвращая пустую строку) либо E_WARNING при записи (оставляя строку без изменений).

Замечание : К символу в строке также можно обращаться с помощью фигурных скобок, например, $str{42} .

Внимание

Попытка записи в смещение за границами строки дополнит строку пробелами до этого смещения. Нецелые типы будет преобразованы в целые. Неверный тип смещения вызовет ошибку уровня E_WARNING . Используется только первый символ присваемой строки. Начиная с PHP 7.1.0, присвоение пустой строки вызовет фатальную ошибку. Ранее в таком случае присваивался нулевой байт (NULL).

Внимание

Строки в PHP внутренне представляют из себя массивы байт. Как результат, доступ или изменение строки по смещению небезопасно с точки зрения многобайтной кодировки, и должно выполняться только со строками в однобайтных кодировках, таких как, например, ISO-8859-1.

Замечание : Начиная с PHP 7.1.0, использование пустого индекса вызывает фатальную ошибку, ранее в подобном случае строка преобразовывалась в массив без предупреждения.

Пример #12 Несколько примеров строк

// Получение первого символа строки
$str = "This is a test." ;
$first = $str [ 0 ];

// Получение третьего символа строки
$third = $str [ 2 ];

// Получение последнего символа строки
$str = "This is still a test." ;
$last = $str [ strlen ($str )- 1 ];

// Изменение последнего символа строки
$str = "Look at the sea" ;
$str [ strlen ($str )- 1 ] = "e" ;

?>

Начиная с PHP 5.4 смещение в строке должно задаваться либо целым числом, либо строкой, содержащей цифры, иначе будет выдаваться предупреждение. Ранее смещение, заданное строкой вида "foo" , без предупреждений преобразовывалось в 0 .

Пример #13 Различия между PHP 5.3 и PHP 5.4

$str = "abc" ;

Var_dump ($str [ "1" ]);
var_dump (isset($str [ "1" ]));

Var_dump ($str [ "1.0" ]);
var_dump (isset($str [ "1.0" ]));

Var_dump ($str [ "x" ]);
var_dump (isset($str [ "x" ]));

Var_dump ($str [ "1x" ]);
var_dump (isset($str [ "1x" ]));
?>

Результат выполнения данного примера в PHP 5.3:

string(1) "b" bool(true) string(1) "b" bool(true) string(1) "a" bool(true) string(1) "b" bool(true)

Результат выполнения данного примера в PHP 5.4:

string(1) "b" bool(true) Warning: Illegal string offset "1.0" in /tmp/t.php on line 7 string(1) "b" bool(false) Warning: Illegal string offset "x" in /tmp/t.php on line 9 string(1) "a" bool(false) string(1) "b" bool(false)

Замечание :

Попытка доступа к переменным других типов (исключая массивы или объекты, реализующие определенные интерфейсы) с помощью или {} молча вернет NULL .

Замечание :

В PHP 5.5 была добавлена поддержка доступа к символам в строковых литералах с помощью синтаксиса или {} .

Для модификации строк существует множество полезных функций.

Основные функции описаны в разделе строковых функций , а для расширенного поиска и замены - функции Perl-совместимых регулярных выражений .

Преобразование в строку

Значение может быть преобразовано в строку с помощью приведения (string) , либо функции strval() . В выражениях, где необходима строка, преобразование происходит автоматически. Это происходит, когда вы используете функции echo или print , либо когда значение переменной сравнивается со строкой. Прочтение разделов руководства Типы и Манипуляции с типами сделает следующее более понятным. Смотрите также settype() .

Массивы всегда преобразуются в строку "Array" , так что вы не можете отобразить содержимое массива (array ), используя echo или print , чтобы узнать, что он содержит. Чтобы просмотреть отдельный элемент, используйте что-нибудь вроде echo $arr["foo"] . Смотрите ниже советы о том, как отобразить/просмотреть все содержимое.

Для преобразования переменной типа "Object" в тип string используется магический метод __toString .

Значение NULL всегда преобразуется в пустую строку.

Как вы могли видеть выше, прямое преобразование в строку массивов, объектов или ресурсов не дает никакой полезной информации о самих значениях, кроме их типов. Более подходящий способ вывода значений для отладки - использовать функции print_r() и var_dump() .

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

Преобразование строк в числа

Если строка распознается как числовое значение, результирующее значение и тип определяется так, как показано далее.

Если строка не содержит какой-либо из символов ".", "e", или "E", и значение числа помещается в пределы целых чисел (определенных PHP_INT_MAX ), строка будет распознана как целое число (integer ). Во всех остальных случаях она считается числом с плавающей точкой (float ).

Значение определяется по начальной части строки. Если строка начинается с верного числового значения, будет использовано это значение. Иначе значением будет 0 (ноль). Верное числовое значение - это одна или более цифр (могущих содержать десятичную точку), по желанию предваренных знаком с последующим необязательным показателем степени. Показатель степени - это "e" или "E" с последующими одной или более цифрами.

$foo = 1 + "10.5" ; // $foo это float (11.5)
$foo = 1 + "-1.3e3" ; // $foo это float (-1299)
$foo = 1 + "bob-1.3e3" ; // $foo это integer (1)
$foo = 1 + "bob3" ; // $foo это integer (1)
$foo = 1 + "10 Small Pigs" ; // $foo это integer (11)
$foo = 4 + "10.2 Little Piggies" ; // $foo это float (14.2)
$foo = "10.0 pigs " + 1 ; // $foo это float (11)
$foo = "10.0 pigs " + 1.0 ; // $foo это float (11)
?>

Более подробную информацию об этом преобразовании смотрите в разделе о strtod(3) документации Unix.

Если вы хотите протестировать любой из примеров этого раздела, скопируйте и вставьте его и следующую строку, чтобы увидеть, что происходит:

echo "\$foo== $foo ; тип: " . gettype ($foo ) . "
\n" ;
?>

Не ожидайте получить код символа, преобразовав его в целое (как это делается, например, в C). Для преобразования символов в их ASCII-коды и обратно используйте функции ord() и chr() .

Подробности реализации строкового типа

7 years ago

The documentation does not mention, but a closing semicolon at the end of the heredoc is actually interpreted as a real semicolon, and as such, sometimes leads to syntax errors.

$foo = abcd
END;
?>

This does not:

foo (abcd
END;
);
// syntax error, unexpected ";"
?>

Without semicolon, it works fine:

foo (abcd
END
);
?>

3 years ago

You can use string like array of char (like C)

$a = "String array test";

var_dump($a);
// Return string(17) "String array test"

var_dump($a);
// Return string(1) "S"

// -- With array cast --
var_dump((array) $a);
// Return array(1) { => string(17) "String array test"}

var_dump((array) $a);
// Return string(17) "S"

Norihiori

15 years ago

You can use the complex syntax to put the value of both object properties AND object methods inside a string. For example...
class Test {
public $one = 1 ;
public function two () {
return 2 ;
}
}
$test = new Test ();
echo "foo { $test -> one } bar { $test -> two ()} " ;
?>
Will output "foo 1 bar 2".

However, you cannot do this for all values in your namespace. Class constants and static properties/methods will not work because the complex syntax looks for the "$".
class Test {
const ONE = 1 ;
}
echo "foo {Test::ONE} bar" ;
?>
This will output "foo {Test::one} bar". Constants and static properties require you to break up the string.

3 years ago

Beware that consistent with "String conversion to numbers":

If ("123abc" == 123 ) echo "(intstr == int) incorrectly tests as true." ;

// Because one side is a number, the string is incorrectly converted from intstr to int, which then matches the test number.

// True for all conditionals such as if and switch statements (probably also while loops)!

// This could be a huge security risk when testing/using/saving user input, while expecting and testing for only an integer.

// It seems the only fix is for 123 to be a string as "123" so no conversion happens.

?>

6 years ago

Leading zeroes in strings are (least-surprise) not treated as octal.
Consider:
$x = "0123" + 0;
$y = 0123 + 0;
echo "x is $x, y is $y"; //prints "x is 123, y is 83"
in other words:
* leading zeros in numeric literals in the source-code are interpreted as "octal", c.f. strtol().
* leading zeros in strings (eg user-submitted data), when cast (implicitly or explicitly) to integer are ignored, and considered as decimal, c.f. strtod().

10 years ago

Here is an easy hack to allow double-quoted strings and heredocs to contain arbitrary expressions in curly braces syntax, including constants and other function calls:

// Hack declaration
function _expr ($v ) { return $v ; }
$_expr = "_expr" ;

// Our playground
define ("qwe" , "asd" );
define ("zxc" , 5 );

$a = 3 ;
$b = 4 ;

function c ($a , $b ) { return $a + $b ; }

echo "pre { $_expr (1 + 2 )} post\n" ; echo "pre { $_expr (qwe )} post\n" ; echo "pre { $_expr (c ($a , $b )+ zxc * 2 )} post\n" ;

// General syntax is {$_expr(...)}
?>

2 years ago

I though that it would be helpful to add this comment so that the information at least appears on the right page on the PHP site.

Note that if you intend to use a double-quoted string with an associative key, you may run into the T_ENCAPSED_AND_WHITESPACE error. Some regard this as one of the less obvious error messages.

An expression such as:

$fruit =array(
"a" => "apple" ,
"b" => "banana" ,
);

Print "This is a $fruit [ "a"]" ; ?>

will definitely fall to pieces.

You can resolve it as follows:

print "This is a $fruit [ a ] " ; print "This is a ${ fruit [ "a" ]} " ; print "This is a { $fruit [ "a" ]} " ; ?>

I have a personal preference for the last variation as it is more natural and closer to what the expression would be like outside the string.

It’s not clear (to me, at least) why PHP misinterprets the single quote inside the expression but I imagine that it has something to do with the fact quotes are not part of the value string - once the string is already being parsed the quotes just get in the way … ?

2 years ago

Both should work:(

class Testing {
public static
$VAR = "static" ;
public const VAR =
"const" ;

Public function sayHelloStatic () {
echo
"hello: { $this :: $VAR } " ;
}

Public function sayHelloConst () {
echo
"hello: { $this ::VAR} " ; }
}

$obj = new Testing ();
$obj -> sayHelloStatic ();
$obj -> sayHelloConst ();

3 years ago

Something I experienced which no doubt will help someone . . .
In my editor, this will syntax highlight HTML and the $comment:

$html = $comment
EOD;

Using this shows all the same colour:

$html = $comment
EOD;

making it a lot easier to work with

11 years ago

To save Your mind don"t read previous comments about dates ;)

When both strings can be converted to the numerics (in ("$a" > "$b") test) then resulted numerics are used, else FULL strings are compared char-by-char:

var_dump ("1.22" > "01.23" ); var_dump ("1.22.00" > "01.23.00" ); var_dump ("1-22-00" > "01-23-00" ); var_dump ((float) "1.22.00" > (float) "01.23.00" ); ?>

Строки в PHP обрамляются одинарными или двойными кавычками. Главное различие в том, что в двойные кавычки можно подставить переменную:

Теперь мы можем придумать ещё одно решение задачи из урока Переменные в PHP :

$title"; echo "

$content

"; ?>

Как PHP находит переменную в строке?

Всё просто. Помните, какие символы могут использоваться в названии переменной? Это цифры, буквы и подчёркивание _ .

Вот PHP и принимает за название всё, что находится между символом $ и первым запрещённым символом.

В следующем коде PHP неправильно определит название переменной и выдаст ошибку:

Результат в браузере:

Notice: Undefined variable: priceруб in D:\OpenServer\domains\сайт\index.php on line 3

Чтобы PHP правильно определил название переменной в строке, нужно поместить её в фигурные скобки {} :

Результат в браузере:

1499руб

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

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

Экранирование кавычек

Если вам нужно поместить кавычки внутрь строки, есть 2 способа это сделать:

Во втором примере обратный слеш \ экранирует следующую за ним кавычку, чтобы PHP воспринял её как строку.

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