Whoops, I linked to the wrong gist...  Here's the proper one:

https://gist.github.com/1955338

On Thu, Mar 1, 2012 at 11:32 PM, David Muir <davidkm...@gmail.com> wrote:
> I can't comment on the internal implementation, but I like the use of
> the casting syntax. It's not as pretty, but make the intent clear, and
> there's not BC issues with class names.
>
> David
>
> On 02/03/12 14:48, Anthony Ferrara wrote:
>> Hey all,
>>
>> I know given all the discussion about this topic lately, this is a hot
>> topic.  But I whipped together a quick POC patch to implement scalar
>> type casting for function parameters.  Let me describe it:
>>
>> Patch: https://gist.github.com/1947259
>>
>> Example:
>>
>> function foo( (int) $bar ) {
>>     var_dump($bar);
>> }
>>
>> foo(1); // int(1)
>> foo("1"); // int(1)
>> foo(1.5); // int(1)
>> foo("foo"); // E_RECOVERABLE_ERROR - Expected integer
>> foo(array()); // E_RECOVERABLE_ERROR
>>
>> Right now, I only implemented the checks for (int), but I add the
>> parser constructs for (int), (float), (bool), (string) and (object)...
>>
>> Now, let's talk why I did what I did:
>>
>> Why did I use cast syntax?  Well, there are really three main reasons.
>>  First off, to indicate that a cast may happen.  Second, to prevent
>> needing new tokens (and hence reserved words).  And third to provide a
>> distinction between a string class type hint and a string scalar type
>> hint.
>>
>> Why did I only implement (int)?  Well, because I just wanted to build
>> a quick dirty POC that can be executed to see the semantics of
>> operation.  There are issues with it now, so rather than doing all the
>> work to re-do it later, I just implemented int...
>>
>> Why implement (object)?  Because right now, there's no way to say you
>> want to accept a generic object without caring about type.  So the
>> (object) cast/hint would then provide that ability to accept a generic
>> object.
>>
>> Why not implement (resource)?  Because that would require a new parser
>> token, as it's not available now...
>>
>> How does the casting work?  Right now, it's using a copy of the same
>> rules that internal functions use with zend_parse_parameters.  That
>> way, it brings the operating semantics of internal functions and
>> userland functions more inline with each other.
>>
>>
>>
>> So with that said, there are some (significant) issues with the patch:
>>
>> 1. First off, the arg checks happen before separation of the zval on
>> non-referenced calls.  So that means the cast effects the original
>> zval AND the argument.  Which is a no-go for a production patch.  So
>> that means that the cast logic would need to be put after the zval
>> split.  But we'd still want the checks first, so it's not too
>> difficult to segregate, just requires deeper changes.  It's not
>> difficult (that I can see yet), just more work...  Example of the
>> problem:
>>
>> # sapi/cli/php -r 'function foo((int) $bar) { var_dump($bar); } $a =
>> "1"; foo($a); var_dump($a);'
>> int(1)
>> int(1)
>>
>> 2.  Right now, the zend_aprse_arg_impl (
>> http://lxr.php.net/xref/PHP_5_4/Zend/zend_API.c#zend_parse_arg_impl )
>> that's used by internal functions is defined as static.  So we'd be
>> copying a lot of the code back and forth.  In the production patch,
>> I'd also want to re-factor that out a bit into either functions or
>> macros to handle the type conversion and casting in both places.  That
>> way, both systems would behave identical (or as close as possible).
>>
>>
>> So, with that said, what do you think?  Is this something worth
>> pursuing?  Are there any fundamental issues that I'm missing?  What
>> else would we need to cover in a production patch and RFC?
>>
>> Thanks,
>>
>> Anthony
>>
>

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

Reply via email to