In JavaScript , you can do this:
const str = `${capitalize(name)} is cool.`;
Can you do the same with PHP double quote string?
Especially if the function is not a method of some instance (not calling a function pointer from variable)
This does not seem to work:
$str = "ucfirst($faker->word) $faker->buildingNumber";
No, sorry, there's nothing like that built into PHP.
The Strings documentation describes the kinds of substitutions that are done inside double-quoted strings and heredocs.
When a string is specified in double quotes or with heredoc, variables are parsed within it.
There are two types of syntax: a simple one and a complex one. The simple syntax is the most common and convenient. It provides a way to embed a variable, an array value, or an object property in a string with a minimum of effort.
The complex syntax can be recognised by the curly braces surrounding the expression.
...
Complex syntax
Any scalar variable, array element or object property with a string representation can be included via this syntax.
Neither the simple nor complex syntax can be used to include a function call.
Related
I regularly use the PHP HereDocs and NowDocs to add large strings of HTML, JavaScript, and CSS content to my code, but I sometimes run into situations where I want to have a PHP variable's value substituted into a HereDoc string that also contains jQuery code, which causes errors/problems when the $ prefix for jQuery conflicts with the $ prefix for the PHP variable's name. This situation only gets worse when I prefix JavaScript object variables that are assigned jQuery Objects because I indicate this by prefixing the JavaScript variable name with a $, i.e., $variable-name.
Is there a way to configure PHP to only substitute variable values when it 'sees' a variable specified as ${variable-name} instead of $variable-name? This way the PHP compiler won't produce an error when it can't find a PHP variable for the jQuery statement that follows the $ or cause problems when it substitutes my jQuery statement or JavaScript variables for a PHP variable that happens to exits?
When I use a HereDoc, I explicitly use double quotes around the opening identifier to make it clear that I'm going to specify a PHP variable in the string that will have its value substituted into the string, i.e.:
$statement = <<<"STATEMENT"...${phpVar}...STATEMENT;
I realize that the default action of a HereDoc is to allow substitutions and explicitly enclosing the identifier with double quotes just makes it easier to differentiate the HereDoc from a NowDoc statement, and that enclosing a php variable in curl-braces only makes the variable easier for me to see the PHP variable amongst the rest of the text in the string.
I use NowDocs to prevent the unwanted substitutions or to make the compilation faster.
However, I'm looking for a way to make variable substitution only happen when I explicitly use double quotes in my HereDocs and curl-braces around the PHP variable.
To get around situations where I need to use jQuery and PHP variable substitution in the same text string, I break my HTML/JavaScript/CSS into chunks and enclose them in HereDocs and NowDocs, but this makes reading my code much harder.
If it isn't possible to make ${php_variable} the only way to cause variable value substitution rather than $php_variable in HereDocs that explicitly use double quotes, then how can I submit this as an enhancement request to the PHP Development Organization?
Thanks
I've been trying to find solution somewhere for this possibly simple fix but, I haven't been able to surprisingly.
How is it possible to stop PHP from assuming a variable is a part of a string. E.g.
The line of code is $string = "slfnnwnfkw49828323$dgjkt^7ktlskegjejke";
how do you stop PHP from thinking '$dgjkt' is a variable within the string when it's really a part of the full string as characters. Thanks
Use this string like $sting = 'slfnnwnfkw49828323$dgjkt^7ktlskegjejke'
You have to use ' instead of " otherwise php tries to find any variables inside your string
Read the manual.
The most important feature of double-quoted strings is the fact that
variable names will be expanded. See string parsing for details:
When a string is specified in double quotes or with heredoc, variables are parsed within it.
There are two types of syntax: a simple one and a complex one. The
simple syntax is the most common and convenient. It provides a way to
embed a variable, an array value, or an object property in a string
with a minimum of effort.
The complex syntax can be recognised by the curly braces surrounding
the expression.
I tried to do redirect with this syntax:
header("location: readMore.php?id=$post['post_id']");
But it didn't work. It worked only after someone suggested to put curly brackets around $post['post_id']!
The correct syntax is:
header("location: readMore.php?id={$post['post_id']}");
What does the curly brackets do in this case?
Quoting the manual:
When a string is specified in double quotes or with heredoc, variables are parsed within it.
There are two types of syntax: a simple one and a complex one. The simple syntax is the most common and convenient. It provides a way to embed a variable, an array value, or an object property in a string with a minimum of effort.
The complex syntax can be recognised by the curly braces surrounding the expression.
Your first code uses simple syntax, and your second code uses a complex one.
The manual does not explicitly state this, but whitespace in simple syntax seems to be an error, rendering your first code invalid. Complex syntax appears to support the same syntax as regular PHP does as far as I can see, but again this does not seem to be actually guaranteed anywhere.
String interpolation is quite flunky in general:
$a = [['derp']];
$b = $a[0];
// Works. It prints derp
echo "$b[0]";
// Doesn't work. It throws an error
echo "$b[ 0 ]";
// Works. It prints derp
echo "{$b[ 0 ]}";
// Doesn't work. It prints Array[0]
echo "$a[0][0]";
// Works. It prints derp
echo "{$a[0][0]}";
// Doesn't work. It prints { Array[0] }
echo "{ $a[0][0] }";
You get similar issues with $object -> foo and $object->foo->bar.
To me, that is pure madness. For that reason I've come to avoid double quoted strings whenever possible (the only thing I used them for are for escape sequences like "\n"). I instead use single quotes and string concatenation, like so:
header( 'location: readMore.php?id=' . $post[ 'post_id' ] );
This lets you use actual PHP syntax for variables without the horrible death trap that is string interpolation.
I came to this question to know more about constant interpolation syntax when those PHP "<<<" things are used to create multiline strings called Heredocs (which allow variable interpolation, unlike Nowdocs).
However, it seems there is no specific syntax for them, and therefore a simple workaround is to create a closure to do so. In here it is just an anonymous function assigned to a variable that will be invoked with parameters:
$int = 'intruder'; // Variable
define('con', '"smart"'); // Constant
// For complex interpolation:
// 1. Define a closure (anonymous function)
// 2. Assign it to a variable with a short name (e.g.: _ )
// 3. Invoke the function by calling the variable with parameters enclosed in ()
$_ = function ($val){return $val;};
$doc = <<<TXT
Hi there,
One day I caught this $int nearby.
I was then told that actually other {$_(con)} $int was there before.
So who came first, the chicken or the egg?
TXT; // Heredoc
echo $doc;
Output:
Hi there,
One day I caught this intruder nearby.
I was then told that actually other "smart" intruder was there before.
So who came first, the chicken or the egg?
You can test the above online on 3v4l. This was based on this answer with a few more examples with operations inside the interpolation brackets.
When you use double or single quotes, PHP will treat whatever is in it as a string unless you tell it that it’s a variable. PHP understands anything after { followed by $ as a variable and treats it as such. Here is an example:
$Text = "XYz";
echo "name-{$Text}";
The other alternative method is to use concatenation. Here is an example:
header("location: readMore.php?id=" . $post['post_id']);
Brackets allow PHP to read what's inside as a variable. You can do that this way too:
header("location: readMore.php?id=" . $post['post_id']);
PHP's simple string interpolation doesn't recognize quoted array keys, which your example demonstrates perfectly. In fact, the correct way to write this is exactly opposite depending on which syntax used: simple vs complex.
Simple syntax - Wrong
Quoted keys cannot be parsed.
header("location: readMore.php?id=$post['post_id']");
Simple syntax - Right
The unquoted string is the associative array key.
header("location: readMore.php?id=$post[post_id]");
Complex syntax - Wrong
It will work, but only if post_id is a defined constant. If not, you'll get a PHP warning.
header("location: readMore.php?id={$post[post_id]}");
Complex syntax - Right
Written just like outside the string.
header("location: readMore.php?id={$post['post_id']}");
To quote the manual on the complex syntax:
// Works, quoted keys only work using the curly brace syntax
echo "This works: {$arr['key']}";
I'd recommend using complex (curly brace) syntax if using quoted keys. And you really should be using them, because outside the string interpolation unquoted keys are actually constants. It's too bad the simple syntax won't allow them, because it makes code reviews and updating old PHP code more difficult.
$foo=['hello' => "Hello"];
echo $foo['hello']; // it works as we are doing in normal way
echo "$foo['hello']"; // it throws T_ENCAPSED_AND_WHITESPACE error when we use same variable double quote
echo $foo[hello]; // Throwing error Use of undefined constant.
echo "$foo[hello]"; // Strange!!! it WORKS because not checking constants are skipped in quotes
I am very surprised in echo "$foo[hello]"; because not checking hello index as constant. Exactly I want to know reason behind this?
Because that's how PHP's simple string parsing works. It's not PHP array syntax, it's string interpolation syntax.
Well documented: http://php.net/manual/en/language.types.string.php#language.types.string.parsing.
From manual:
It works because PHP automatically converts a bare string (an unquoted string which does not correspond to any known symbol) into a string which contains the bare string. For instance, if there is no defined constant named bar, then PHP will substitute in the string 'bar' and use that.
and
Note: To reiterate, inside a double-quoted string, it's valid to not surround array indexes with quotes so "$foo[bar]" is valid. See the above examples for details on why as well as the section on variable parsing in strings.
In manual see: Array do's and don'ts
I'm doing a basic quiz . I don't understand the last part:
$_SESSION["x{$user['serial']}"]
What exactly does x{5} array value mean?
x isn't defined anywhere, and in general object literals should be like {x: 5} – some help with this would be great.
session_start();
function setData($data){
if(is_array($data)){
$x = 1;
foreach ($data as $key => $value) {
$_SESSION["x$value"] = $x;
$x++;
}
}
}
$user = array('id'=>3,'serial'=>5);
setData($user);
echo $_SESSION["x{$user['serial']}"];
The curly brackets is used for expanding complex expressions inside double-quote strings, like arrays.
So, in your example, x{$user['serial']} will expand to "x5". You can also write x$value as x{$value}, both with the same result.
BTW that object literal is for Javascript, not PHP :)
You can't access (all kinds of) arrays in a double quoted string.
For instance:
echo "x$user['serial']";
This results in:
PHP Parse error: syntax error, unexpected '' (T_ENCAPSED_AND_WHITESPACE), expecting identifier (T_STRING) or variable (T_VARIABLE) or number (T_NUM_STRING) in php shell code on line 1
In other words, access array elements in an indexed array ("$user[0]") works, but accessing associative elements with a string literal doesn't.
doesn't work because it is too complicated to parse. By using accolades, you say the part should be interpreted separately.
So:
echo "x{$user['serial']}";
is equivalent to:
echo "x".$user['serial'];
The resulting code is thus:
echo $_SESSION["x".$user['serial']];
But more simple.
Given your sample $user, the result is that you access x5 from $_SESSION.
It is not x{5} because it doesn't mean anything. The expression:
"x{$user['serial']}"
is a string enclosed in double quotes. Inside strings enclosed in double quotes, PHP does what in other languages is called "variables interpolation". In plain English, it searches for variable names and replaces them with their values.
It can easily recognize variable names in strings and replace them but the things become more difficult when you want to use more complex expressions like arrays or objects. It could try to guess what the programmer wants but this is not a solution.
That's why PHP finds only simple variables inside the double quotes and relies on the programmer to signal when they want to insert complex things like arrays and objects. And the programmer uses curly braces ({ and }) to tell PHP about the complex expressions inserted in strings.
Check the documentation about string parsing on PHP manual.
Without using the curly braces, in the string "x$user['serial']" PHP recognizes the variable $user and ignores the ['serial'] part. It attempts to replace $user with its string representation and because it is an array, the final string becomes "xArray['serial']" and that is not what you want.
Using curly braces allows the programmer to write something like "x{$user[$field]}" given the variable $field was initialized forehand with the string 'serial'.
If $user['serial'] == 5 then the final outcome is $_SESSION["x5"].
Curly braces can always be used to enclose the variable names in double quoted strings. They are useful, for example, in this situation:
$sep = '--';
$str = "a{$sep}b";
// echo($str) will produce: a--b
Without curly braces around the variable $sep, the string looks like "a$sepb", PHP finds inside it the variable name $sepb and because no such variable exists, the value of $str becomes "a" and this is not what we intended.