Hi Rowan Tommins, > > - The benefit is that dumping the result of expressions improves the > > default experience. > > psysh wouldn't be installed by default when a new developer is learning > >php through the php manual, or when sshed into a remote server. > > It doesn't feel to me that you've really answered Nikita's question: if > all the code using these hooks is going to be distributed as userland > code anyway, then they're not going to improve the default experience.
I was saying that I'd planned to propose defaults if this passed. __debugInfo() is a slight improvement, but the human-readable representation of an object isn't always the same thing as the debug representation of the object. A human-readable representation might be `Point(x: 1, y: 2)`, where var_dump or var_export(`__set_state`) is much longer, and I don't believe var_dump is a one size fits all solution for both simple and recursive data structures, especially since `__debugInfo` predates the repl. ``` php > class Point { public function __construct(public int $x, public int $y) {} } php > var_export(new Point(1, 2)); Point::__set_state(array( 'x' => 1, 'y' => 2, )) ``` > It feels like we need to go in one of two directions: > a) Build a full-featured official REPL with all of these improvements > completely implemented out of the box. Limited extension hooks might > still be desirable to build custom versions for frameworks etc, but they > could be more targeted - for custom input, it could be "register > meta-command"; for custom output, we already have __debugInfo() at the > class level. I'd be happy as long as we made progress on improving the interactive shell. Psysh is 2.4MB as a compiled phar release and larger if distributed with library/application releases (e.g. on remote servers). default extension hooks would likely be much smaller. > b) Expose the magic behaviour needed for something like PsySh to do > everything `php -a` already can, and leave the rest to userland. So far, > the only mentioned requirement is a special form of eval() that swallows > fatal errors. That may or may not be possible to do through creating a new `unsafe_eval` PECL (or only exposing it for interactive sessions) - I'd have to check. Something like `unsafe_eval(string $code, array &$variables): mixed result` (or throw UnsafeFatalError) The usual caveats about not using it in production would apply - the php compiler treats eval differently in that it has access to the caller's scope. https://github.com/bobthecow/psysh/blob/master/src/ExecutionLoopClosure.php uses eval(), but there's actually a lot of heuristics to avoid calling eval() on code with common known fatal errors. (it uses the readline/libedit PHP module if it's available, but doesn't load readline_cli.c) The ext/readline/readline_cli.c overrides `EG(bailout)` with zend_try macros to recover from fatal errors ```c zend_try { zend_eval_stringl(code, prompt_end - prompt_spec - 1, NULL, "php prompt code"); } zend_end_try(); ``` > My feeling is that the current mood of the community favours (b) rather > than (a); the most obvious example is that PHP used to bundle a PEAR > executable, but Composer remains an entirely external project. Is there > a reason not to aim for the same "de facto standard" for a REPL? Even if we do start distributing a better alternative shell with php or endorsing an alternative in docs, it's still possible to incrementally improve `php -a` It seems like a significant missing feature to omit printing expression results from `php -a`; people who do use `php -a` may wish to continue using that feature set (e.g. `#setting_name=value` to set/dump ini variables) but still benefit from minor improvements such as this RFC. https://github.com/bobthecow/psysh/issues/462 mentions psysh isn't a drop-in replacement. E.g. on shared hosting or when debugging on a remote host, it may be inconvenient to download psysh and faster to use `php -a` https://www.php.net/manual/en/features.commandline.interactive.php only mentions `php -a`. Perhaps it should mention external userland shells with a note that they're developed independently if the REPL rarely receives updates in favor of other functionality. - Someone learning from the php.net manual or a tutorial with minimal dependencies wouldn't install psysh right now. Aside: the php manual doesn't mention composer except in a few PECL extension docs, but people seem to figure out how to use composer out of necessity and library installation docs. Interactive shells wouldn't be as advertised Cheers, -Tyson -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: https://www.php.net/unsub.php