> On Feb 9, 2020, at 8:34 PM, tyson andre <tysonandre...@hotmail.com> wrote:
> 
>> 1. Why again are MyClass::methodName() not considered for the non-whitelist 
>> vote? 
>> 
>> Seems to me a developer would be more inclined to implement the expressions 
>> that define the class constant's value in a method of the class than in an 
>> external function.
> 
> My reasons for doing this were to keep the scope small and easy to implement,
> and work on an RFC for methods immediately after if the vote for allowing 
> arbitrary functions passed.
> 
> The other concern was the edge case `static::method_name()` in class 
> constants,
> but `call_user_func(['static', 'method_name'])` or 
> `array_map('static::method_name', VALS)`
> causes the same issues.
> 
> This leads me to a blocker I've discovered with this implementation calling 
> without a whitelist:
> The way PHP resolves the scope is to look for the closest closure or 
> user-defined function,
> then to extract the class of that function. (in zend_get_executed_scope).
> I thought the scope would work because `const X = self::Y` works,
> but it turns out ZEND_AST_CLASS_CONST is special cased in AST evaluation.
> My current ideas for fixing this (for class constants and property defaults):
> (Parameter defaults, static variables, and global constants should already 
> have reasonable scopes)
> 
> 1. Wrap all of the calls the engine is making in a byte copy of 
> call_user_func, but with the property `zend_class_entry *scope` set, so that 
> zend_get_executed_scope will see that frame's scope and use it instead of the 
> caller's scope.
> 2. Add a fake stack frame that acts as if an extra closure (bound to the 
> declaring class's scope) was being evaluated.
> 3. Add a brand new function.
> 
> If I don't do that, then constant/property evaluation uses the scope of the 
> caller, not the class
> 
> ```
> class MyClass {
>    public static function example() {}
>    const X = call_user_func('self::example');
> }
> // this throws in the current implementation
> // due to no active class scope, and that's a bug
> echo MyClass::X; 
> ```
> 
> If I (or anyone else) can't figure out how to implement the fix, or the fix 
> has issues,
> I might remove the secondary vote from the RFC and just vote on the whitelist,
> which excluded functions accepting callables.
> If anyone comes up with a working implementation for a fix (including 
> exception handling),
> I'd like to know.
> 

Thanks for the reply.

>> 2. Do we really want to add a standard library function 53 characters long? 
>> 
>> Can we not come up with a more concise name than 
>> get_defined_functions_allowed_in_constant_expressions(), like maybe 
>> get_const_expr_funcs() or get_const_expressions()?
> 
> I was planning to change it if I thought of a better name.
> For get_const_expr_funcs(), I'd think it would be important to be consistent 
> about
> naming in the standard library.
> `get_const_expr_functions()` would work, though.

Oh, okay.  But don't you think the 'consistent naming in PHP' ship sailed eons 
ago?!?

(Sorry, I just could not resist!  :-)

-Mike

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

Reply via email to