> <?: $a, $b ?>

php already uses ?: for ternary operator, so users get a bit confused by using 
it for escaping.

> <?* $a | $b ?>

this allows multiple interpretations:

<?* $a | $b ?> meaning $a context $b
<?* $a | $b ?> meaning $a | $b context 'html'

> <?* $a |> $b ?>

|> may be used by Pipe Operator rfc, if vote is successful

> if ($context == 'html') {

this is bad coding style since $context = 0 gives unexpected html escaping. The 
following expressions would be equal:

<?* $str, 'html' ?>
<?* $str, 0 ?>

please use:
if ($context === 'html') {
if ($context === 'js') {

> <?* $a, 'js', 'html' ?>

currently we cannot use set_escape_handler(function($str, ...$context = 'html') 
since variadic parameters cannot have a default value. So having second 
argument be any type should be fine.


Maybe add an example for using escape operator callback functions in frameworks:

public function render($template, $vars) {
  $this->setVars($vars);
  set_escape_handler(['SomeClass', 'methodName']);
  ob_start();
  include $template;
  $content = ob_get_clean();
  restore_escape_handler();
  return $content;
}


In total a good rfc everybody should be happy with.

Regards
Thomas


Michael Vostrikov wrote on 24.07.2016 11:48:

> I have written many messages already. I think, the purpose of this operator
> is clear.
> In this discussion I have come up to understanding what I would like to use.
> 
> You suggest very hard and complex solutions:
> 
> <?*js*html= $str ?>
> <?php['html']: ?>
> $escape = new SplEscaper; $escape->support('e', function () { ... });
> declare('filter=htmlentities');
> 
> This is not what I wanted to suggest.
> 
> 
> I have rewritten RFC a little. There is no tricks with ZEND_NAME_NOT_FQ,
> there is no magic constants, there is no problems with autoloading. The
> soultion is small, simple, and customizable.
> https://wiki.php.net/rfc/escaping_operator
> 
> 
> There are 3 functions:
> callable|null set_escape_handler(callable $handler)
> bool restore_escape_handler()
> escape_handler_call(mixed $string, mixed $context)
> 
> They work similar to set_error_handler() / restore_error_handler().
> 
> 
> Operator is compiled into the following AST:
> echo escape_handler_call(first_argument, second_argument);
> 
> Function escape_handler_call() just pass given arguments into user-defined
> handler. Second argument is not required. If the handler is not set, it
> throws an exception. There is no default handler for any context, to
> prevent 'built-in' wrong work of <?* $str ?> constructions in non-HTML
> contexts like CSV. This is not hard to create a handler once. Default
> context can be set in it as default value for second argument.
> 
> set_escape_handler(function($str, $context = 'html') {
>    ...
> });
> 
> 
> 
> What is under discussion:
> 
> Starting sign.
> Last one is more comfortable to type.
> 
> <?* $a, $b ?>
> <?: $a, $b ?>
> 
> 
> Separator sign.
> Maybe it should differ from standard <?= $a, $b ?> syntax to prevent
> mistakes like <?= $a, 'html' ?> instead of <?* $a, 'html' ?>. '|' won't
> give error, but looks more similar to escaping in template engines.
> 
> <?* $a , $b ?>
> <?* $a | $b ?>
> <?* $a |> $b ?>
> <?: $a : $b ?>
> 
> 
> If to wrap functions in a class or namespace (fully qualified), to not
> clutter up a global namespace:
> 
> set_escape_handler()
> restore_escape_handler()
> escape_handler_call()
> 
> PHPEscaper::setEscapeHandler()
> PHPEscaper::restoreEscapeHandler()
> PHPEscaper::escapeHandlerCall()
> 
> And also any names in source code or details of implementation, without
> changing main algorithm.
> 
> 
> What is not under discussion:
> 
> Built-in contexts.
> Because escape_handler_call() is not an escaper itself, but just a helper
> to call user-defined escaper, it should not handle any contexts. This
> allows to prevent 'built-in' wrong work of <?* $str ?> constructions in
> non-HTML contexts like CSV.
> 
> Multiple arguments.
> <?* $a, 'js', 'html' ?>
> I think, it is enough that second argument can be of any type, e.g. an
> array.
> 
> Complicated syntax like <?*html*js= $str ?>.
> If we allow custom handlers, then we need runtime processing, so the
> example above cannot be compiled into
> <?= htmlspecialchars(json_encode($str)) ?>
> directly, and it will something like
> <?= escape_handler_call(escape_handler_call($str, 'html'), 'js') ?>
> I.e. we anyway need to pass context as a second argument, so why not allow
> user to do it.
> 
> 
> If someone wants more complex solution or built-in template engine, he can
> create another RFC and suggest his own implementation.
> 


-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to