Ah, sorry! Misread your post. Anyways, the compiler doesn't transform
`\array_keys()` yet, so there's no optimization for that.

As for other compiler optimizations, 2 that I know that the compiler does
is:

1. Binary OP evaluation i. e. `2 * 2` does not yield `ZEND_ADD` opcode but
is instead computed by the compiler directly.

2. There are special functions that have their own opcodes. You can learn
more about those here:
https://phpinternals.net/articles/optimising_internal_functions_via_new_opcode_instructions

Best regards,
Benas

On Tue, Sep 15, 2020, 4:44 PM Chase Peeler <chasepee...@gmail.com> wrote:

> I wasn't proposing that my example be supported. I'm totally okay with the
> fact that it doesn't. My question was about whether or not those kinds of
> optimizations are documented anywhere so that developers can make sure they
> don't miss out on them by not fitting the proper pattern.
>
> On Tue, Sep 15, 2020 at 9:40 AM Benas IML <benas.molis....@gmail.com>
> wrote:
>
>> Hey,
>>
>> During my free time, I'm implementing that specific `array_keys`
>> optimization. I'm not planning on supporting cases like yours (i. e.
>> indirection through a variable) since there's no point in doing that. And
>> also, it's not feasible to support every use case. Should we also support
>> cases like this?
>>
>> ```php
>> $a = 'array_keys';
>> $b = $a(...);
>> $c = 'b';
>>
>> foreach ($$c as $key) {
>>     ...
>> }
>> ```
>>
>> Obviously not. `\array_keys` optimization will work the same way as an
>> optimized `strlen` function works.
>>
>> That means that the optimization is only going to be applied if the
>> `array_keys` function is used directly in the `foreach` loop and only if a)
>> either the namespace is global b) or `\array_keys(...)`/`use function
>> array_keys` is used.
>>
>>
>> Best regards,
>> Benas
>>
>> On Tue, Sep 15, 2020, 4:23 PM Chase Peeler <chasepee...@gmail.com> wrote:
>>
>>> I brought this up on another thread, but it wasn't addressed (which is
>>> fine, since it was somewhat off-topic). I thought it might be
>>> worth bringing up in its own thread, though.
>>>
>>> In the other thread, someone had mentioned the following compiler
>>> optimization
>>>
>>> foreach(\array_keys($arr) as $key) {
>>>
>>> and quietly transform that into:
>>>
>>> foreach ($arr as $key =>
>>> $_unusedVariableNameThatIsntEvenSpilledToTheScope)
>>> {
>>>
>>> I would be more likely to write:
>>>   $keys = array_keys($arr);
>>>   foreach($keys as $key){
>>> Which would prevent me from being able to take advantage of the
>>> optimization.
>>>
>>> So, what I was wondering, is if there are other optimizations I might be
>>> missing out on, and if so, are they documented anywhere?
>>>
>>>
>>> --
>>> Chase Peeler
>>> chasepee...@gmail.com
>>>
>>
>
> --
> Chase Peeler
> chasepee...@gmail.com
>

Reply via email to