> It's an interesting idea, but at this time I think it's the wrong > approach to what is in the best long-term interests of the language by > introducing an additional point of inconsistency. > > Classes search the current namespace, but functions / const would search > namespace first, unless they don't, then global?
Assuming you mean "unless they don't" is the additional inconsistency: I still see this as a cleaner/less verbose option than the currently available options for avoiding ambiguity - aliases add similar resolution behavior. "function_name() will search the current namespace first, then the global namespace, unless "use function [.... as] function_name" was found earlier in the namespace block." > For the very minor one-time performance hit (thanks to the cache slot), > I think the situation is best remaining as-is for the time being. That was unintuitive to me -- but it is one-time. (ignoring optimizations of specialized opcodes and inlining results as constants) Running the following example outputs "Length is 4" twice. <?php namespace NSTest; function computeStrlen() { printf("Length is %s\n", strlen("test")); } computeStrlen(); require 'b.php'; computeStrlen(); // contents of b.php <?php namespace NSTest; function strlen($x) { return -1; } > In future, I think the optimal solution is opt-in deprecating fallback > to the root namespace using a declare. > ... Id like to see nikic/scalar_objects added to the core in 8.0 Various global functions (strlen(), count(), class_exists(), is_string(), etc.) are more frequently used than namespaced functions in many files, and removing the fallback *to* the global scope would break most third party code, which might be unmaintained. This backwards compatibility break would discourage upgrading to future major versions. > That doesn't cover defined constants, but IMO we should be pushing those > to be moved into class constants, simply because in the absense of > function / constant / anything-but-class level autoloading, things might > as well be in a readily available location. Out of scope of this RFC: I had a thought today about autoloading. I'd rather improve function / const autoloading instead of moving to classes. What if an ambiguous function_name() or const outside the global namespace would attempt to autoload *ambiguous* functions in the global scope, but not the current namespace? (and autoload unambiguous functions in their respective scope) function_exists() or defined() would not autoload, to preserve the behavior/performance of current programs. Anything with the callable type hint (e.g. array_map) would also need to be modified. - Same for global constants - That should avoid the performance hit - this autoloading would only be triggered when php would previously throw an Error or warning for undefined functions/constants. - This would also avoid the need to load polyfill files (e.g. mbstring) or test framework files when their functions/constants are unused. - The main blocker for other autoload proposals seemed to be performance if I understood correctly (e.g. attempting to autoload NS\strlen() every time strlen was called) Fully-qualified calls (through use, \, or being in the global scope) would autoload the unambiguous name for missing functions. And there'd have to be a hash map or other check to avoid recursion on the same constant/function. -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php