> 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.


> 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.
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to