Php как вставить переменную в строку
Перейти к содержимому

Php как вставить переменную в строку

  • автор:

Вставка переменных в строки в PHP

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

Давайте попробуем на практике. Пусть у нас есть некоторая переменная:

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

А теперь изменим кавычки нашей строки на двойные и выполним в нее вставку переменной:

Упростите следующий код:

strval

Возвращает строковое значение переменной. Смотрите документацию по типу string для более подробной информации о преобразовании в строку.

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

Список параметров

Переменная, которую необходимо преобразовать в строку.

value может быть любого скалярного типа, null или объектом ( object ), который реализует метод __toString(). strval() нельзя применить к массиву или объекту, которые не реализуют метод __toString().

Возвращаемые значения

Строковое значение ( string ) параметра value .

Примеры

Пример #1 Пример использования strval() с магическим методом PHP __toString().

class StrValTest
public function __toString ()
return __CLASS__ ;
>
>

// Выводит ‘StrValTest’
echo strval (new StrValTest );
?>

Смотрите также

  • boolval() — Возвращает логическое значение переменной
  • floatval() — Возвращает значение переменной в виде числа с плавающей точкой
  • intval() — Возвращает целочисленное значение переменной
  • settype() — Задаёт тип переменной
  • sprintf() — Возвращает отформатированную строку
  • number_format() — Форматирует число с разделением групп
  • Манипуляции с типами
  • __toString()

User Contributed Notes 9 notes

7 years ago

Some notes about how this function has changed over time, with regards the following statement:

> You cannot use strval() on arrays or on objects that
> do not implement the __toString() method.

In PHP 5.3 and below, strval(array(1, 2, 3)) would return the string «Array» without any sort of error occurring.

From 5.4 and above, the return value is unchanged but you will now get a notice-level error: «Array to string conversion».

For objects that do not implement __toString(), the behaviour has varied:

PHP 4: «Object»
PHP 5 < 5.2: "Object id #1" (number obviously varies)
PHP >= 5.2: Catchable fatal error: Object of class X could not be converted to string

16 years ago

As of PHP 5.2, strval() will return the string value of an object, calling its __toString() method to determine what that value is.

19 years ago

If you want to convert an integer into an English word string, eg. 29 -> twenty-nine, then here’s a function to do it.

Note on use of fmod()
I used the floating point fmod() in preference to the % operator, because % converts the operands to int, corrupting values outside of the range [-2147483648, 2147483647]

I haven’t bothered with «billion» because the word means 10e9 or 10e12 depending who you ask.

The function returns ‘#’ if the argument does not represent a whole number.

$nwords = array( «zero» , «one» , «two» , «three» , «four» , «five» , «six» , «seven» ,
«eight» , «nine» , «ten» , «eleven» , «twelve» , «thirteen» ,
«fourteen» , «fifteen» , «sixteen» , «seventeen» , «eighteen» ,
«nineteen» , «twenty» , 30 => «thirty» , 40 => «forty» ,
50 => «fifty» , 60 => «sixty» , 70 => «seventy» , 80 => «eighty» ,
90 => «ninety» );

function int_to_words ( $x ) global $nwords ;

if(! is_numeric ( $x ))
$w = ‘#’ ;
else if( fmod ( $x , 1 ) != 0 )
$w = ‘#’ ;
else if( $x < 0 ) $w = 'minus ' ;
$x = — $x ;
> else
$w = » ;
// . now $x is a non-negative integer.

if( $x < 21 ) // 0 to 20
$w .= $nwords [ $x ];
else if( $x < 100 ) < // 21 to 99
$w .= $nwords [ 10 * floor ( $x / 10 )];
$r = fmod ( $x , 10 );
if( $r > 0 )
$w .= ‘-‘ . $nwords [ $r ];
> else if( $x < 1000 ) < // 100 to 999
$w .= $nwords [ floor ( $x / 100 )] . ‘ hundred’ ;
$r = fmod ( $x , 100 );
if( $r > 0 )
$w .= ‘ and ‘ . int_to_words ( $r );
> else if( $x < 1000000 ) < // 1000 to 999999
$w .= int_to_words ( floor ( $x / 1000 )) . ‘ thousand’ ;
$r = fmod ( $x , 1000 );
if( $r > 0 ) $w .= ‘ ‘ ;
if( $r < 100 )
$w .= ‘and ‘ ;
$w .= int_to_words ( $r );
>
> else < // millions
$w .= int_to_words ( floor ( $x / 1000000 )) . ‘ million’ ;
$r = fmod ( $x , 1000000 );
if( $r > 0 ) $w .= ‘ ‘ ;
if( $r < 100 )
$word .= ‘and ‘ ;
$w .= int_to_words ( $r );
>
>
>
return $w ;
>

?>

Usage:
echo ‘There are currently ‘ . int_to_words ( $count ) . ‘ members logged on.’ ;
?>

18 years ago

I can’t help being surprised that

evaluates to true. It’s the same with strval and single quotes.
=== avoids it.

Why does it matter? One of my suppliers, unbelievably, uses 0 to mean standard discount and 0.00 to mean no discount in their stock files.

16 years ago

The only way to convert a large float to a string is to use printf(‘%0.0f’,$float); instead of strval($float); (php 5.1.4).

// strval() will lose digits around pow(2,45);
echo pow(2,50); // 1.1258999068426E+015
echo (string)pow(2,50); // 1.1258999068426E+015
echo strval(pow(2,50)); // 1.1258999068426E+015

// full conversion
printf(‘%0.0f’,pow(2,50)); // 112589906846624
echo sprintf(‘%0.0f’,pow(2,50)); // 112589906846624

18 years ago

It seems that one is being treated as an unsigned large int (32 bit), and the other as a signed large int (which has rolled over/under).

2326201276 — (-1968766020) = 4294967296.

16 years ago

As of PHP 5.1.4 (I have not tested it in later versions), the strval function does not attempt to invoke the __toString method when it encounters an object. This simple wrapper function will handle this circumstance for you:

/**
* Returns the string value of a variable
*
* This differs from strval in that it invokes __toString if an object is given
* and the object has that method
*/
function stringVal ($value)
// We use get_class_methods instead of method_exists to ensure that __toString is a public method
if (is_object($value) && in_array(«__toString», get_class_methods($value)))
return strval($value->__toString());
else
return strval($value);
>

18 years ago

In complement to Tom Nicholson’s contribution, here is the french version (actually it’s possible to change the language, but you should check the syntax 😉 )

function int_to_words($x) global $nwords;

if(!is_numeric($x))
$w = ‘#’;
else if(fmod($x, 1) != 0)
$w = ‘#’;
else if($x < 0) $w = $nwords['minus'].' ';
$x = -$x;
> else
$w = »;
// . now $x is a non-negative integer.

if($x < 21) // 0 to 20
$w .= $nwords[$x];
else if($x < 100) < // 21 to 99
$w .= $nwords[10 * floor($x/10)];
$r = fmod($x, 10);
if($r > 0)
$w .= ‘-‘. $nwords[$r];
> else if($x < 1000) < // 100 to 999
$w .= $nwords[floor($x/100)] .’ ‘.$nwords[‘hundred’];
$r = fmod($x, 100);
if($r > 0)
$w .= ‘ ‘.$nwords[‘separator’].’ ‘. int_to_words($r);
> else if($x < 1000000) < // 1000 to 999999
$w .= int_to_words(floor($x/1000)) .’ ‘.$nwords[‘thousand’];
$r = fmod($x, 1000);
if($r > 0) $w .= ‘ ‘;
if($r < 100)
$w .= $nwords[‘separator’].’ ‘;
$w .= int_to_words($r);

>
> else < // millions
$w .= int_to_words(floor($x/1000000)) .’ ‘.$nwords[‘million’];
$r = fmod($x, 1000000);
if($r > 0) $w .= ‘ ‘;
if($r < 100)
$word .= $nwords[‘separator’].’ ‘;
$w .= int_to_words($r);
>
>
>
return $w;
>

// Usage in English
$nwords = array( «zero», «one», «two», «three», «four», «five», «six», «seven»,
«eight», «nine», «ten», «eleven», «twelve», «thirteen»,
«fourteen», «fifteen», «sixteen», «seventeen», «eighteen»,
«nineteen», «twenty», 30 => «thirty», 40 => «forty»,
50 => «fifty», 60 => «sixty», 70 => «seventy», 80 => «eighty»,
90 => «ninety» , «hundred» => «hundred», «thousand»=> «thousand», «million»=>»million»,
«separator»=>»and», «minus»=>»minus»);

echo ‘There are currently ‘. int_to_words(-120223456) . ‘ members logged on.
‘;

//Utilisation en Francais
$nwords = array( «zéro», «un», «deux», «trois», «quatre», «cinq», «six», «sept»,
«huit», «neuf», «dix», «onze», «douze», «treize»,
«quatorze», «quinze», «seize», «dix-sept», «dix-huit»,
«dix-neuf», «vingt», 30 => «trente», 40 => «quarante»,
50 => «cinquante», 60 => «soixante», 70 => «soixante-dix», 80 => «quatre-vingt»,
90 => «quatre-vingt-dix» , «hundred» => «cent», «thousand»=> «mille», «million»=>»million»,
«separator»=>»», «minus»=>»moins»);

echo ‘Il y a actuellement ‘. int_to_words(-120223456) . ‘ membres connectés.
‘;

PHP — объединение или прямая вставка переменных в строку

Мне интересно, как правильно вставлять переменные PHP в строку?

echo «Welcome «.$name.»!»

Или так:

echo «Welcome $name!»

Оба этих метода работают в моем PHP v5.3.5. Последний короче и проще, но я не уверен, что первый лучше форматируется или воспринимается как более правильный.

Ответ 1

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

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

echo «Welcome $names!»;

PHP будет интерпретировать ваш код так, как будто вы пытаетесь использовать переменную $names, которой не существует. Обратите внимание, что это сработает, только если вы используете «», а не » для вашей строки. В этом случае вам нужно будет использовать <>:

echo «Welcome s!»

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

echo «Welcome «.$name.»!»;

Возможно, его можно оптимизировать, избегая конкатенации, используя:

echo «Welcome «, $name, «!»;

Ответ 2

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

// синтаксическая ошибка!!

//$s = «Hello !»

// единственный вариант

$s = «Hello » . trim($world) . «!»;

Ответ 3

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

$num = 5;

$word = ‘banana’;

$format = ‘можете ли вы произнести %d раз, слово %s ‘;

echo sprintf($format, $num, $word);

Ответ 4

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

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

Часто приходится использовать такие костыли, как <> и \, что вносит путаницу и делает читаемость конкатенации почти эквивалентной, если не лучше.

Как только вам нужно обернуть вызов функции вокруг var, например, htmlspecialchars($var), вы должны перейти на конкатенацию. Также вы не можете встраивать константы.

В некоторых специфических случаях «двойные кавычки со вставкой vars» могут быть полезны, но в целом я бы выбрал конкатенацию (используя одинарные или двойные кавычки, когда это удобно).

Ответ 5

Выбирайте первое и используйте одинарные кавычки!

Это легче читать, а значит, другие программисты будут знать, что происходит.

Это работает немного быстрее, так как опкоды создаются, когда PHP разбирает ваш исходный код, но в любом случае он это сделает, так что протяните ему руку помощи!

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

Единственная ситуация, когда вы должны использовать двойные кавычки, — это когда вам нужны \r, \n, \t! В других случаях использование двойных кавычек не стоит того.

Вы также должны проверить PHP конкатенацию переменных, используя phpbench.com для некоторых сравнительных тестов различных методов.

Ответ 6

Если вы хотите выполнить команду SQL, а ваши переменные являются членами массива, то вы не должны использовать одинарные кавычки внутри [] массива (как здесь: [»]); например, если вы используете эту строку в качестве команды SQL, вы получите серверную ошибку 500:

$con = mysqli_connect(‘ServerName’, ‘dbUsername’, ‘dbPassword’);

mysqli_select_db($con, ‘dbName’)

//’ID’ — поле с автоматическим инкрементом.

$sql = «INSERT INTO sampleTable (ID, TraceNo) VALUES (»,’$sampleArray[‘TraceNo’]’)»;

mysqli_query($con, $sql)

Правильная строка:

//’ID’ — поле с автоматическим инкрементом.

$sql = «INSERT INTO sampleTable (ID, TraceNo) VALUES (»,’$sampleArray[TraceNo]’)»;

Ответ 7

  1. Лучший синтаксис: Это личное предпочтение.
  2. Производительность: Никакой разницы. Как многие упоминали, двойная кавычка может быть быстрее, если использовать нереально много переменных.
  3. Лучшее использование: Одинарная кавычка (в основном). С одинарной кавычкой вы можете объединить что угодно, даже вызовы функций и изменение переменных, например: echo ‘hi ‘ . trim($name) . ($i + 1);. Единственное, что может сделать двойная кавычка, чего не может сделать одинарная , — это использование \n, \r, \t и т. п.
  4. Читабельность: Нет разницы (возможно, это личные предпочтения).
  5. Удобство записи/перезаписи/отладки: В 1-строчных утверждениях разницы нет, но , когда речь идет о нескольких строках, проще комментировать/ не комментировать строки при отладке или написании. Например:
  1. Меньше escape-последовательностей: Одинарная кавычка. Для одинарной кавычки нужно экранировать только 2 символа (‘ и \). Для двойной кавычки нужно экранировать 2 символа («, \) и еще 3, если требуется ($, < и >).
  2. Меньше изменений: Одинарная кавычка. Например, если у вас есть следующий код:
  1. Заключение: Используйте то, что вам больше нравится.

Мы будем очень благодарны

если под понравившемся материалом Вы нажмёте одну из кнопок социальных сетей и поделитесь с друзьями.

PHP: Переменные и конкатенация

Для закрепления предыдущей темы попробуем использовать переменные с конкатенацией. Синтаксически ничего не меняется: мы умеем конкатенировать (склеивать) две строки:

 "Kingsroad" 

… а значит сумеем конкатенировать строку и одну переменную, в которой записана строка:

 "Kingsroad" 

… и даже конкатенировать две переменные, в которых записаны строки:

 "Kingsroad" 

Задание

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

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

Для заголовка используйте переменные $firstName и $greeting , запятую и восклицательный знак. Выведите это на экран в правильном порядке.

Для тела письма используйте переменные $info и $intro , при этом второе предложение должно быть на новой строке.

Результат на экране будет выглядеть так:

Hello, Joffrey! Here is important information about your account security. We couldn't verify you mother's maiden name.

Выполните задание, используя только два print_r() .

Упражнение не проходит проверку — что делать? ��

Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:

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

В моей среде код работает, а здесь нет ��

Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.

Мой код отличается от решения учителя ��

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

В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.

Прочитал урок — ничего не понятно ��

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

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

Полезное

  • Подумайте, с какой строкой и в каком порядке нужно склеивать переменные, чтобы получить такой двухстрочный вывод тела письма.
  • Помните, что можно создать строку, которая содержит только управляющую последовательность \n .

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *