Enhance PHP sprintf with Python-style named parameters
- PHP >= 5.5
- Composer
composer require lightster/named-sprintf:dev-master
<?php
use Lstr\Sprintf\Sprintf;
require_once __DIR__ . '/vendor/autoload.php';
$sprintf = new Sprintf();
echo $sprintf->sprintf(
"Hello %(first_name)s %(last_name)s\n",
['first_name' => 'Matt', 'last_name' => 'Light']
);
?>
Similar to PHP's built-in sprintf
, types and format options can be
passed after the named parameter:
<?php
$sprintf = new Sprintf();
echo $sprintf->sprintf(
"PI is approximately %(pi).5f, or %(pi).8f if you need more accuracy\n",
['pi' => pi()]
);
echo $sprintf->sprintf(
"The type is optional and defaults to string (e.g. 's'): %(name)\n",
['name' => 'Typeless!']
);
?>
Values can be processed before they are formatted by passing middleware
to the constructor of Sprintf
. The middleware can be any sort of
PHP callable and will be passed the parameter name that is about to be
formatted and a callable that gives the middleware access to all of
the values passed to $sprintf->sprintf()
.
The below example takes any parameter passed in as an array and converts
it to a space-delimited string of words before passing the value to the
sprintf
string formatter:
<?php
$sprintf = new Sprintf(
function ($name, callable $values) {
$value = $values($name);
if (is_array($value)) {
return implode(' ', $value);
}
return $value;
}
);
echo $sprintf->sprintf(
"Middleware %(action_words) to pre-process %(what)!\n",
[
'action_words' => ['can', 'be', 'used'],
'what' => 'parameters',
]
);
?>
Reusable, chainable middleware can be developed by extending the AbstractInvokable class. Some reusable middleware is shipped with named-sprintf.
The Cli\Bundle middleware is a series of middleware that is bundled together to allow for easy command line string generation.
<?php
use Lstr\Sprintf\Middleware\Cli\Bundle as CliBundle;
$sprintf = new Sprintf(new CliBundle());
echo $sprintf->sprintf(
"php bin/some-cli %(sub-command) %(long-options) %(short-options)",
[
'sub-command' => 'commit',
'long-options' => [
'message' => 'Showing off a CLI command',
'author' => 'Matt',
],
'short-options' => [
'a' => null,
],
]
) . "\n";
?>