Proposal: short_var_export($value, bool $return=false, int $flags=0)

From: Date: Mon, 18 Jan 2021 21:12:01 +0000
Subject: Proposal: short_var_export($value, bool $return=false, int $flags=0)
Groups: php.internals 
Request: Send a blank email to internals+get-112924@lists.php.net to get a copy of this message
Hi internals, I've created a PR https://github.com/php/php-src/pull/6619 to add an alternative to var_export(). The proposed short_var_export() also outputs/returns a parseable representation of a variable, but adds requested features for var_export. 1. Use null instead of NULL - the former is recommended by more coding guidelines (https://www.php-fig.org/psr/psr-2/). 2. Change the way indentation is done for arrays/objects. See ext/standard/tests/general_functions/short_var_export1.phpt (e.g. always indent with 2 spaces, never 3 in objects, and put the array start on the same line as the key) 3. Render lists as "[\n 'item1',\n]" rather than "array(\n 0 => 'item1',\n)" 4. Prepend \ to class names so that generated code snippets can be used in namespaces (e.g. with eval()) without any issues. 5. Support opt-in SHORT_VAR_EXPORT_SINGLE_LINE in int $flags. This will use a single-line representation for arrays/objects, though strings with embedded newlines will still cause newlines in the output. ("['item']") Changing var_export() itself has been proposed 9 months ago (https://externals.io/message/109415) but the RFC discussion seems to be on hold. https://externals.io/message/106674#106684 suggested adding a new function as an alternative. One of the major objections is that changing var_export() (instead of adding a new function) would have these drawbacks: 1. It would be impractical to backport/polyfill calls with 3 args to older php versions, if int $flags was added. ArgumentCountErrors are thrown in php 8.0 for too many parameters, and earlier php versions warn 2. If defaults were changed, then thousands of unit tests in php-src and other projects may fail due to tests expecting the exact representation of a variable, requiring a lot of work to update tests I feel like the user-friendliness of the enhancements makes adding another function to PHP worth it. (e.g. copying short_var_export() into a code snippet such as the expectation for a unit test or a configuration) I don't believe I've seen an RFC for a separate function before. Also, a native C implementation would be much more efficient than a polyfill implemented in PHP, e.g. https://github.com/brick/varexporter/issues/14 I plan to start an RFC document shortly. Thoughts? (e.g. for the name, short_var_export() seemed more appropriate than var_export_short(), pretty_var_export() or canonical_var_export()) Thanks, - Tyson

« previous php.internals (#112924) next »