Yet another thing that’s great in PHP is the power you have when doing some string manipulation/operation. Here’s something that is really useful, but I think it remains a bit unknown. Let’s imagine you need to take the first (or whatever) character of a string. Most developers go to the obvious:
This code chunk return the first character of $str, but it can be used with the same success for any other character of the string. In my opinion this is more cleaner and its really syntactically self documented.
This approach can be useful when trying to check whether the first symbol for instance is “?” or “/”.
PHP is really full of functions for everything! Most of the time when you try to do something with strings, there’s a function that can do it better and faster.
The Route from $_GET to String
The global arrays in PHP contain request parameters. Either GET or POST. As you know if the page address is something like:
http://www.example.com/index.php?a=b&key=value
http://www.example.com/index.php?a=b&key=value
This means that you pass to the index.php file two parameters – “a” and “key” with their values: “b” and “value”. Now in this case you can dump the $_GET global array somewhere in index.php and you’ll receive something like this.
Most of the code chunks I’ve seen about getting a file extension from a string are based on some sort of string manipulation. If you want to get the filename extension with PHP is better to use pathinfo() than string manipulations
You should know that in JavaScript you cannot simply write a multilined code chunk, i.e. something like this:
var str ='hello
world';
var str = 'hello
world';
This will result in an error, which can be a problem when you deal with large strings. Imagine a string containing some HTML that should be injected via innerHTML. Now one possible solution is to concatenate two or more strings, by splitting the initial string.
var str ='hello'+'world';
var str = 'hello'
+ 'world';
Howerver this solution result in some additional operations like concatenation. It can be very nice if there was something like the PHP multiline string format.
The PHP Example
In PHP you have the same use case with strings. You can have a string concatenated over multiple lines, but you cannot split lines like so:
// the following line is wrong$str='hello
world';// a possible solution to the line above is$str='hello'.'world';// which is very similar to the js solution in the second example// ... but in PHP there is the so called HEREDOC$str=<<<EOD
hello
world
EOD;
// the following line is wrong
$str = 'hello
world';
// a possible solution to the line above is
$str = 'hello'
. 'world';
// which is very similar to the js solution in the second example
// ... but in PHP there is the so called HEREDOC
$str = <<<EOD
hello
world
EOD;
The heredoc gives us the power to write multiline strings.
The JavaScript Trick
Actually in JavaScript there is something that’s exactly what Heredoc is meant to be for PHP. Take a look at the last example:
var text =<>this<br />
is
my
multi-line
text
</>.toString();
document.body.innerHTML= text;
var text = <>
this <br />
is
my
multi-line
text
</>.toString();
document.body.innerHTML = text;
Thus you can write multiline strings in the JavaScript code.
Here’s the tricky part. As we know from the exec() man page this function executes the given command. As described there, the exact declaration of this method is:
string exec( string $command[,array&$output[, int &$return_var]])
However sometimes that is not so true. Let’s see an example with the popular FFMPEG program. In one hand when you try to start a video converting program with PHP you can simply call exec with the FFMPEG command as the first parameter. The output is OK and you can dump it as in the example here.
In some cases you can call FFMPEG only with the -i option to get some info about the input file. Such info can be the size of the image, the bitrate of the source file or the length of the movie. Executing this command:
in the terminal you’ll see the output you wish. However if you trying to execute the command via exec() the output remains empty?
Why the Output Parameter is Empty?
Looking at the terminal screen you can’t see the difference, but actually in the second case, when you execute FFMPEG only with the -i option, the output is redirected to the standard error output. That’s why you can’t see it in the exec() second parameter. However there is a solution.
Sometimes PHP's exec() doesn't return the command output. You've to be sure that the command output is not redirected to the standard error stream.
Solution and Conclusion
The solution is quite simple. You’ve to redirect the output of the FFMPEG command to the standard output.
This showcase with the FFMPEG is important not only because now you can call FFMPEG’s command without problems, but because you now know that exec() can’t read the standard error output. Thus you’ve to be careful and always redirect to the standard output.