Php одинарные и двойные кавычки. Разница между двойными и одинарными кавычками в PHP. Пример #3 Пример определения heredoc-строки

Как вы видели в предыдущем уроке, команда echo в php является средством вывода текста. На протяжении своей карьеры в PHP вы будете использовать команду echo больше, чем любую другую. Так давайте в ней хорошенько разберемся!

Вывод строки

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

I love using PHP!"; ?>

Вывод фразы «Hello!» нам уже знаком, тут ничего нового. Зато следующая команда echo, как вы видите, содержит html тег. Использовать html теги не запрещается, ведь php дает нам динамику, а статика и оформление страницы все еще во власти обычного html.

Осторожно, двойные кавычки!

Это очень здорово, что вы можете выводить HTML внутри PHP. Тем не менее, вы должны быть осторожны при использовании HTML-кода или любой другой строки, содержащей кавычки! В Эхо используются кавычки, чтобы определить начало и конец строки, поэтому вы должны использовать один из следующих вариантов, если хотите использовать кавычки внутри echo:

  • Не используйте кавычки внутри строки.
  • Экранируйте внутренние кавычки через слеш. Чтобы избежать обработки внутренних кавычек, просто поставьте обратную косую черту прямо перед ними, то есть \».
  • Используйте одинарные кавычки (апострофы) на внутри строки.

Смотрите наш пример ниже для правильного и неправильного использования команды echo:

I love using PHP!"; // OK because we escaped the quotes! echo "

I love using PHP!
"; // OK because we used an apostrophe " echo "
I love using PHP!
"; ?>

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

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

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

Результат:

Hello Bob. My name is: 4a

Одновременный вывод переменных и текстовых строк

Вы также можете выводить переменные в двойных кавычках (например, «текст текст $variable»). Поставив переменную внутри кавычек («») вы говорите PHP, что вы хотите, чтобы он взял ее значение, преобразовал его к строковому типу и вывел. Пример ниже показывает как правильно сделать такой трюк:)

"; echo "Hi, I"m Bob. Who are you? $my_string
"; echo "Hi, I"m Bob. Who are you? $my_string Bobetta"; ?>

Результат:

Hello Bob. My name is: Bobetta Hi, I"m Bob. Who are you? Hello Bob. My name is: Hi, I"m Bob. Who are you? Hello Bob. My name is: Bobetta

Размещая переменные внутри строки, вы можете сэкономить время и сделать код более удобным для чтения, но к этому надо привыкнуть. Не забывайте использовать кавычки, одинарные кавычки не будут выводить значения переменных. Одинарные кавычки просто выведут имя переменной в строку, т.е. $ my_string, а не «Hello Bob. My name is».

Echo не является функцией!

Echo является не функцией, а языковой конструкцией. При использовании функции в PHP, они имеют очень конкретную форму, которую мы обязательно рассмотрим чуть позже. На данный момент, просто знайте, что echo это специальный инструмент, который вы обязательно полюбите! :D

Конкатенация строк PHP

Самая, пожалуй, распространенная операция со строками - это их конкатенация, или присоединение к одной строке другой. Для конкатенации строк ввели специальный оператор «.» (точка).

Пример:


На выходе получаем строку целиком: «Широка страна моя родная!».

Значениями типа string являются текстовые строки (кратко строки). Строка — это последовательность из нуля или более символов. Символы включают в себя буквы, цифры, знаки пунктуации, специальные символы и пробелы.

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

  • двойными кавычками
  • одинарными кавычками
  • heredoc-синтаксисом
  • nowdoc-синтаксисом

Строка в двойных кавычках

Строка в двойных кавычках:

В строках с двойными кавычками можно использовать управляющие последовательности. Управляющая последовательность — это специальные символы предназначенные для форматирования текстового вывода. В PHP доступны следующие управляющие последовательности:

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


Знак доллара: \$";

Строки, заключённые в двойные кавычки, могут содержать символы одинарных кавычек:

Echo "Одинарная кавычка: "";

Строка в одинарных кавычках (апострофах)

Строка в одинарных кавычках:

$str = "Строка"; echo "Одну большую строку можно разбить на несколько маленьких строк, чтобы её было удобнее читать.";

В отличие от строк в двойных кавычках и heredoc-синтаксиса, переменные и управляющие последовательности (за одним исключением), заключённые в одинарные кавычки, не обрабатываются. Это означает, что они будут интерпретированы как обычные символы строки:

$num = 10; echo "Число: $num
Знак доллара: \$";

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

Echo "Внутри используются \"одинарные\" кавычки"; echo "Обратный слэш: \\";

Строки, заключённые в одинарные кавычки, могут содержать символы двойных кавычек:

Echo "Двойная кавычка: "";

Heredoc-синтаксис

Heredoc-синтаксис — это альтернативный способ записи строк.

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

Heredoc-синтаксис начинается с трёх символов <<< , после которых должен быть указан произвольный идентификатор (назовём его открывающим). Идентификатор может быть указан как в двойных кавычках, так и без них. Сразу после идентификатора должен следовать перевод на новую строку, никаких других символов кроме перевода на новую строку после идентификатора не должно быть, иначе возникнет ошибка. Далее идёт непосредственно строковое содержимое. После строкового содержимого, на отдельной строке, должен быть указан закрывающий идентификатор (тот же, что и после <<<). Перед ним и после него не должно быть никаких пробелов или других символов, за исключением точки с запятой. Если это правило нарушено, то считается, что закрывающий идентификатор отсутствует и будет вызвана ошибка:

<<

Nowdoc-синтаксис

Nowdoc-синтаксис также как и Heredoc является альтернативным способом записи строк.

Строка, определяемая с помощью Nowdoc-синтаксиса, работает также, как и строка, расположенная в одинарных кавычках. Разница между Nowdoc и строкой в одинарных кавычках заключается в том, что используя Nowdoc нет необходимости экранировать одинарные кавычки.

Синтаксис Nowdoc похож на Heredoc с той лишь разницей, что открывающий идентификатор обязательно должен быть заключён в одинарные кавычки:

$num = 10; echo <<<"some_id" Число: $num some_id;

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

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

Простой синтаксис — это когда имя переменной указывается в строке как есть.

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

$str = "World!"; echo "Hello $str";

Сложный синтаксис — это когда имя переменной заключается в фигурные скобки.

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

$sport1 = "волей"; $sport2 = "фут"; echo "Мне нравится $sport1бол и $sport2бол";

В данном случае не будет достигнут желаемый результат, поскольку интерпретатор будет считать $sport1 как часть имени переменной $sport1бол, которой не существует.

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

$sport1 = "волей"; $sport2 = "фут"; echo "Мне нравится {$sport1}бол и {$sport2}бол.";

Знак доллара может быть расположен как перед фигурной скобкой, так и после неё:

$sport1 = "волей"; $sport2 = "фут"; echo "Мне нравится ${sport1}бол и {$sport2}бол.";

Конкатенация

Конкатенация — это объединение двух или более строк в одну большую. Объединение происходит с помощью оператора конкатенации — . (точка). При конкатенации каждая последующая строка добавляется в конец предыдущей:

Значение любого типа, которое объединяется со строкой, будет неявно преобразовано в строку и далее будет произведена конкатенация:

"; echo "Число: " . 1; ?>

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

Чтобы использовать одинарную кавычку внутри строки, проэкранируйте ее обратной косой чертой (\ ). Если необходимо написать саму обратную косую черту, продублируйте ее (\\ ). Все остальные случаи применения обратной косой черты будут интерпретированы как обычные символы: это означает, что если вы попытаетесь использовать другие управляющие последовательности, такие как \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} последовательность символов, соответствующая регулярному выражению символа в восьмеричной системе счисления
\x{1,2} последовательность символов, соответствующая регулярному выражению символа в шестнадцатеричной системе счисления

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

Heredoc

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

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

Внимание

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

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

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

Пример #1 Неверный пример

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

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

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

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

Class foo
{
var $foo ;
var $bar ;

Function foo ()
{
$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:

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

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

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

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

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

Nowdoc

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

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

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

$str = <<<"EOD"
Пример текста,
занимающего несколько строк,
с помощью синтаксиса nowdoc.
EOD;

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

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

$foo = new foo ();
$name = "МоеИмя" ;

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

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

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

Замечание :

В отличие от heredoc, nowdoc может быть использован в любом контексте со статическими данными. Типичный пример инициализации полей класса или констант:

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

class foo {
public $bar = <<<"EOT"
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 ." ;
?>

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

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

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

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

$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 ." ; // Won"t work
?>

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

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 .

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

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

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

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

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

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

// Не работает, выводит: Это { здорово}
echo "Это { $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() .

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

Внимание

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

Внимание

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

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

// Получение первого символа строки
$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 .

Пример #10 Различия между 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"] . Смотрите ниже советы о том, как отобразить/просмотреть все содержимое.

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

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

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

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

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

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

Если строка не содержит какой-либо из символов ".", "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() .

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

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

Данная природа строкового типа объясняет почему в PHP нет отдельного типа “byte” - строки играют эту роль. Функции, возвращающие нетекстовые данные - например, произвольный поток данных, считываемый из сетевого сокета - тем не менее возвращают строки.

Принимая во внимание тот факт, что PHP не диктует определенную кодировку для строк, можно задать вопрос, как в таком случае кодируются строковые литералы. Например, строка "á" эквивалентна "\xE1" (ISO-8859-1), "\xC3\xA1" (UTF-8, форма нормализации C), "\x61\xCC\x81" (UTF-8, форма нормализации D) или какому-либо другому возможному представлению? Ответом является следующее: строка будет закодирована тем образом, которым она записана в файле скрипта. Таким образом, если скрипт записан в кодировке ISO-8859-1, то и строка будет закодирована в ISO-8859-1 и т.д. Однако, это правило не применяется при включенном режиме Zend Multibyte: в этом случае скрипт может быть записан в любой кодировке (которая указывается ясно или определяется автоматически), а затем конвертируются в определенную внутреннюю кодировку, которая и будет впоследствии использована для строковых литералов. Учтите, что на кодировку скрипта (или на внутреннюю кодировку, если включен режим Zend Multibyte) накладываются некоторые ограничения: практически всегда данная кодировка должна быть надмножеством ASCII, например, UTF-8 или ISO-8859-1. Учтите также, что кодировки, зависящие от состояния, где одни и те же значения байт могут быть использованы в начальном и не начальном состоянии сдвига (initial and non-inital shift state), могут вызвать проблемы.

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

  • Некоторые функции предполагают, что строка закодирована в какой-либо однобайтовой кодировке, однако, для корректной работы им не требуется интерпретировать байты как определенные символы. Под эту категорию попадают, например, substr() , strpos() , strlen() и strcmp() . Другой способ мышления об этих функциях представляет собой оперирование буферами памяти, т.е. они работают непосредственно с байтами и их смещениями. offsets.
  • Другие функции ожидают передачу кодировку в виде параметра, возможно, предполагая некоторую кодировку по умолчанию, если параметр с кодировкой не был указан. Такой функцией является
  • Наконец, есть функции, подразумевающие, что строка использует определенную кодировку, обычно UTF-8. Сюда попадают большинство функций из расширений intl и PCRE (в последнем случае, только при указании модификатора u ). Хотя это и сделано специально, функция utf8_decode() подразумевает кодировку UTF-8, а utf8_encode() - ISO-8859-1.

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

Какой вид кавычек использовать для оформления строк - апострофы или классические двойные кавычки?

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

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

Причина здесь проста: строки в двойных кавычках интерпретатор PHP дополнительно проверяет на наличие переменных и если такие находятся, то вместо имени переменной в строку вставляется ее значение. А вот строка, заключенная в апострофы, воспринимается интерпретатором как обычный текст и никаких преобразований в этих строках PHP не проводит. Думаю, понятно, что обработка строк в одинарных кавычках в любом случае будет происходить быстрее.

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

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

Приведем пример использования одинарных кавычек:
// Выведет: Простая строка
echo "Простая строка";
// Выведет: I"m here
echo "I\"m here";
// Выведет: Это не вставит: \n новую строку
echo "Это не вставит: \n новую строку";
// Выведет: Переменная $example тоже не подставится
echo "Переменная $example тоже не подставится"; Если строка заключена в двойные кавычки ("), PHP распознает большее количество управляющих последовательностей для специальных символов а также подставляет вместо имени переменной в строку ее значение. Так же, как и с одинарными кавычками, для того, чтобы использовать двойные кавычки внутри строки, заключенного в двойные кавычки, их необходимо опередить символом обратной косой черты (\).

Приведем пример использования двойных кавычек:
// Выведет: Простая строка
echo "Простая строка";
// Выведет: Фирма "Подснежник ""
echo "Фирма \"Подснежник\"";
// Выведет: Это переведет на новую строку
echo "Это переведет на новую строку \n";
// Выведет: Переменная подставится
$example = "подставится";
echo "Переменная $example"; Следует также помнить, что последовательность "\n" (новая строка), "\r" (возврат каретки) для обычного текста, а не для HTML. Так что в браузере Вы не увидите изменений (только в исходном коде страницы).

Давайте выясним, насколько быстрее одинарные кавычки двойных. Для замеров напишем короткий тестовый скрипт, и сразу заметим, что если Вы у себя будете его тестировать, результаты, которые зависят от аппаратной части вашего ПК или сервера, будут другие.
// Возвращаем метку времени в начале цикла
$start = microtime(true);
// Создаем цикл цикл на 1 млн итераций
for ($i = 0; $i < 1000000; $i++) {
$text = "Здесь символьная строка";
}
// Вычисляем потраченное время
$time = (microtime(true) - $start); Результат: 0.09 секунды.

Если мы заменим одинарные кавычки на двойные:
$text = "Здесь символьная строка"; Результат будет равен 0.10 секунды.

Как видим, при использовании текстовых строк разница во времени выполнения совсем небольшая, даже можно сказать и вовсе не существует. Самое интересное начнется, когда попробуем совместить строку и переменную.
$text = "Здесь символьная строка $i"; или
$text = $i."Здесь символьная строка"; Результат приблизительно: 0.27 секунды.

Разница весьма ощутительная. Конкатенация и двойные кавычки явно влияют на быстродействие, если в строку добавлены переменные.

Когда сервер обрабатывает код, он проверяет все содержимое двойных кавычек на наличие переменных, констант и другое. Это занимает время. А то, что находится между одинарными кавычками сервер обрабатывает как готовый текст и ему все равно, что там находится. Разница между быстродействием одинарных и двойных кавычек очень незначительная, но если Вы будете заниматься разработкой высоко нагруженного проекта, то несколько сэкономленных миллисекунд - это уже победа.

Я сторонник красивого и оптимизированного кода, хоть и не всегда у меня получается следовать всем правилам «хорошего тона» в программировании.

Сейчас же речь пойдет о правильном использовании двойных и одинарных кавычек в php. Перед тем, как начать писать пост, я бегло просмотрел имеющиеся у меня книги по php, и, что странно, ни в одной не увидел правильного использования кавычек. Почему – для меня загадка. Обвинять авторов в дилетантстве нет ни малейшей возможности, книги далеко не для «чайников». Может быть просто не хотели акцентировать на этом внимание, дескать кому надо, тот сам разберется.

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

Следовательно, если нам надо вывести текст «как есть», то используем одинарные кавычки. Если необходимо подставить вместо переменной ее значение – двойные (если переменная только одна, то кавычки можно и вовсе опустить). Часто можно встретить такой код:

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

Рассмотрим тривиальную задачу вывода переменной в составе текста, в том числе и с использованием html кода.

$date"; ?>

Все выводится хорошо, текст и выделенная жирным дата, которая подставляется вместо переменной. Но необходимо помнить две вещи. Первое, это особенность интерпретатора: конкатенация строк происходим намного быстрее и требует меньше ресурсов, нежели синтаксический анализ строк. И второе — не стоит забывать про парадигму программирования «разделяй и властвуй». Не надо мешать все в одно, гораздо правильнее будет разделить текст на две части – требующую и не требующую парсинга интерпретатором. Таким образом, пример выше стоит записать так:

".$date.""; ?>

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

Или, например, при использовании строк при передаче аргументов функции:

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