Re: DOMXPath / XSLTProcessor function callbacks
| From: | Niels Dossche | Date: | Sun, 15 Oct 2023 12:04:53 +0000 |
| Subject: | Re: DOMXPath / XSLTProcessor function callbacks | ||
| References: | 1 2 3 4 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-121323@lists.php.net to get a copy of this message | ||
Hi Marc
On 10/15/23 12:53, Marc wrote:
> Hi,
>
> On 14.10.23 13:54, Niels Dossche wrote:
>> Hi Tim
>>
>> On 10/14/23 12:30, Tim Düsterhus wrote:
>>> Hi
>>>
>>> On 10/13/23 00:39, Niels Dossche wrote:
>>>> Please let me know your thoughts.
>>> What does calling ->registerPHPFunctions() do when it's called more than once?
>>> Will the existing allow-list be overwritten or amended?
>>>
>>> i.e.
>>>
>>> $xpath->registerPHPFunctions([
>>> 'strtoupper',
>>> ]);
>>> $xpath->registerPHPFunctions([
>>> 'ucfirst',
>>> ]);
>>>
>>> will I be able to:
>>>
>>> (a) Call ucfirst(), but not strtoupper()
>>> (b) Call both
>> You can call both, it's additive.
>
> As it's not clear what these functions do wouldn't it make more sense to introduce
> new / more clear functions and deprecate the old?
>
> Like:
>
> ->addXPathCallable(string $alias, callable $fn);
> ->getXPathCallables(): array<string, callable>
> ->removeXPathCallable(string $alias);
This would be the cleaner option.
The question here is how they would interact with each other and the existing
registerPhpFunctions():
- addXPathCallable() when the alias already exists: I guess throw a ValueError
- remove and get should likely also act on the functions registered via registerPhpFunctions()
- What should happen when we call registerPhpFunctions() followed by
addXPathCallable("foo", function ($...) {...});
Probably both global functions and foo should be callable. But what should happen then when there
is also a global function foo, which one should be called? Probably the explicitly registered
callable?
What's currently also weird is that in the following snippet:
```
$xpath->registerPhpFunctions();
$xpath->registerPhpFunctions("ucfirst");
```
then only ucfirst() would be callable, which is surprising especially considering that calling
$xpath->registerPhpFunctions("otherfunction") afterwards will make both ucfirst and
otherfunction callable.
>
> And is it really necessary to be able to register all functions? Also what would happen in this
> case with functions included later? Would they also be callable or only the functions known at the
> point of registering?
>
For the first question: unlikely.
For the second question: they would also be callable.
>>> Best regards
>>> Tim Düsterhus
>> Cheers
>> Niels
>
>
> Best,
> Marc
>
Cheers
Niels