Hi!

On Sun, 5 Sep 2010, Derick Rethans wrote:

> I've spend some more time on this, and have attached a new patch that:
> 
> - Removes the strict type verification, changing it back into typehints 
>   only.
> - Keeps the current syntax so that typehints create structures in the 
>   function entries.
> - Keeps the reflection API for the syntax, so that you can query the 
>   typehints.
> - Changed the API so that the verification function can also modify the 
>   variables.

I've just committed that patch, the implements the 3 first elements from 
this list. I've also updated my little extension to behave in the same 
way as it did with the previous patch:

> I've also written a proof of concept extension at 
> svn://svn.xdebug.org/svn/php/typed and 
> http://svn.xdebug.org/cgi-bin/viewvc.cgi/typed/?root=php that implements 
> both the current strict-type verification, and a form of the "option 1" 
> from 
> http://wiki.php.net/rfc/typecheckingstrictandweak#option_1_current_type_juggeling_rules_with_e_strict_on_data_loss
>  
> (I've not done the E_STRICT warnings for all, as the RFC didn't specifiy 
> when data loss was considered to occur).
> 
> Here follows an example script:
> 
>       <?php
>       function errorHandler( $errno, $string )
>       {
>               global $ok;
>               $ok = $errno;
>               return true;
>       }
> 
>       set_error_handler( 'errorHandler' );
> 
>       $twelve = 12;
>       settype( $twelve, 'float' );
> 
>       $values = array(
>               true, false,
>               0, 1, 12, $twelve, 12.23,
>               'true', 'false',
>               '0', '1', '12', '12abc', '12.0', '12.34', 'foo',
>               array(1,2,3), array('345' => 12),
>               NULL, ''
>       );
>       $funcs = array(
>               'testString', 'testFloat', 'testInt', 'testNumeric', 
> 'testScalar', 'testBool', 'testArray',
>       );
> 
>       function testString( string $a ) { }
>       function testFloat( float $a ) { }
>       function testInt( int $a ) { }
>       function testBool( boolean $a ) { }
>       function testArray( array $a ) { }
>       function testNumeric( numeric $a ) { }
>       function testScalar( scalar $a ) { }
> 
>       echo "string  float   int     numeric scalar  bool    array\n";
>       foreach( $values as $value )
>       {
>               foreach( $funcs as $func )
>               {
>                       $ok = true;
>                       $func($value);
>                       echo $ok === true ? "pass    " : ( $ok === 0x1000 ? 
> "fail    " : "warn    " );
>               }
>               echo ' ', str_replace( "\n", '', var_export( $value, true ) );
>               echo "\n";
>       }
>       ?>
> 
> And the output (with the three different validation/verification methods:
> 
> No validation/verification:
> 
>       der...@kossu:/home/httpd/html/test/verify-arg$ php -dextension=typed.so 
> -dtyped.mode=0 option2.php 
>       string  float   int     numeric scalar  bool    array
>       pass    pass    pass    pass    pass    pass    fail     true
>       pass    pass    pass    pass    pass    pass    fail     false
>       pass    pass    pass    pass    pass    pass    fail     0
>       pass    pass    pass    pass    pass    pass    fail     1
>       pass    pass    pass    pass    pass    pass    fail     12
>       pass    pass    pass    pass    pass    pass    fail     12
>       pass    pass    pass    pass    pass    pass    fail     12.23
>       pass    pass    pass    pass    pass    pass    fail     'true'
>       pass    pass    pass    pass    pass    pass    fail     'false'
>       pass    pass    pass    pass    pass    pass    fail     '0'
>       pass    pass    pass    pass    pass    pass    fail     '1'
>       pass    pass    pass    pass    pass    pass    fail     '12'
>       pass    pass    pass    pass    pass    pass    fail     '12abc'
>       pass    pass    pass    pass    pass    pass    fail     '12.0'
>       pass    pass    pass    pass    pass    pass    fail     '12.34'
>       pass    pass    pass    pass    pass    pass    fail     'foo'
>       pass    pass    pass    pass    pass    pass    pass     array (  0 => 
> 1,  1 => 2,  2 => 3,)
>       pass    pass    pass    pass    pass    pass    pass     array (  345 
> => 12,)
>       pass    pass    pass    pass    pass    pass    fail     NULL
>       pass    pass    pass    pass    pass    pass    fail     ''
> 
> Script type-checks:
> 
>       der...@kossu:/home/httpd/html/test/verify-arg$ php -dextension=typed.so 
> -dtyped.mode=1 option2.php 
>       string  float   int     numeric scalar  bool    array
>       fail    fail    fail    fail    pass    pass    fail     true
>       fail    fail    fail    fail    pass    pass    fail     false
>       fail    fail    pass    pass    pass    fail    fail     0
>       fail    fail    pass    pass    pass    fail    fail     1
>       fail    fail    pass    pass    pass    fail    fail     12
>       fail    pass    fail    pass    pass    fail    fail     12
>       fail    pass    fail    pass    pass    fail    fail     12.23
>       pass    fail    fail    fail    pass    fail    fail     'true'
>       pass    fail    fail    fail    pass    fail    fail     'false'
>       pass    fail    fail    pass    pass    fail    fail     '0'
>       pass    fail    fail    pass    pass    fail    fail     '1'
>       pass    fail    fail    pass    pass    fail    fail     '12'
>       pass    fail    fail    fail    pass    fail    fail     '12abc'
>       pass    fail    fail    pass    pass    fail    fail     '12.0'
>       pass    fail    fail    pass    pass    fail    fail     '12.34'
>       pass    fail    fail    fail    pass    fail    fail     'foo'
>       fail    fail    fail    fail    fail    fail    pass     array (  0 => 
> 1,  1 => 2,  2 => 3,)
>       fail    fail    fail    fail    fail    fail    pass     array (  345 
> => 12,)
>       fail    fail    fail    fail    fail    fail    fail     NULL
>       pass    fail    fail    fail    pass    fail    fail     ''
> 
> "Option 1" type-casting:
> 
>       der...@kossu:/home/httpd/html/test/verify-arg$ php -dextension=typed.so 
> -dtyped.mode=2 option2.php 
>       string  float   int     numeric scalar  bool    array
>       pass    pass    pass    fail    pass    pass    fail     true
>       pass    pass    pass    fail    pass    pass    fail     false
>       pass    pass    pass    pass    pass    pass    fail     0
>       pass    pass    pass    pass    pass    pass    fail     1
>       pass    pass    pass    pass    pass    pass    fail     12
>       pass    pass    warn    pass    pass    pass    fail     12
>       pass    pass    warn    pass    pass    pass    fail     12.23
>       pass    fail    warn    fail    pass    pass    fail     'true'
>       pass    fail    warn    fail    pass    pass    fail     'false'
>       pass    pass    pass    pass    pass    pass    fail     '0'
>       pass    pass    pass    pass    pass    pass    fail     '1'
>       pass    pass    pass    pass    pass    pass    fail     '12'
>       pass    fail    warn    fail    pass    pass    fail     '12abc'
>       pass    pass    pass    pass    pass    pass    fail     '12.0'
>       pass    pass    pass    pass    pass    pass    fail     '12.34'
>       pass    fail    warn    fail    pass    pass    fail     'foo'
>       fail    fail    fail    fail    fail    fail    pass     array (  0 => 
> 1,  1 => 2,  2 => 3,)
>       fail    fail    fail    fail    fail    fail    pass     array (  345 
> => 12,)
>       pass    pass    pass    fail    fail    pass    fail     NULL
>       pass    fail    warn    fail    pass    pass    fail     ''

cheers,
Derick

-- 
http://derickrethans.nl | http://xdebug.org
Like Xdebug? Consider a donation: http://xdebug.org/donate.php
twitter: @derickr and @xdebug

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

Reply via email to