rfc:typehint

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
Last revisionBoth sides next revision
rfc:typehint [2008/04/08 01:33] – BC Break section feliperfc:typehint [2008/04/17 16:59] – typo felipe
Line 3: Line 3:
   * Date: 2008-04-07   * Date: 2008-04-07
   * Author: Felipe Pena <felipensp@gmail.com>   * Author: Felipe Pena <felipensp@gmail.com>
-  * Status: Under Discussion+  * Status: [[http://news.php.net/php.internals/37049|Under Discussion]] 
 + 
 + 
 +====== Details of implementation ====== 
 +**Parameter type hint:** 
 +  - The behavior when the default parameter value is ''NULL'' was kept. 
 +**Both:** 
 +  - Binary and unicode string are specified by ''string''
 + 
 +===== Return value type hint ===== 
 + 
 +==== BC Break ==== 
 +No BC break using the "(type)" syntax. (Inspirated by Objective-C) 
 + 
 + 
 +==== Examples ==== 
 + 
 +=== Using inside namespaces === 
 +<code php> 
 +namespace foo; 
 + 
 +class test { } 
 + 
 +class bar { 
 + static public function (foo::test) testing($instance) { 
 + return $instance; 
 +
 +
 + 
 +bar::testing(new test); 
 +bar::testing(new stdClass); // Catchable fatal error: The returned value should be instance of foo::test 
 +</code> 
 + 
 +=== Using inheritance === 
 +<code php> 
 +interface ITest { } 
 +class bar implements ITest { } 
 +class foo extends bar { } 
 + 
 +function (Itest) testing($instance) { 
 + return $instance;  
 +
 + 
 +testing(new bar); 
 +testing(new foo); 
 +testing(new stdClass); // Catchable fatal error: The returned value must implement interface Itest 
 +</code> 
 + 
 +=== Interfaces === 
 + 
 +<code php> 
 +interface ITest { 
 + public function (int) foo();  
 +
 + 
 +class foo implements ITest { 
 + public function (int) foo() { 
 + return 'a'; 
 + }  
 +
 + 
 +$test = new foo; 
 +$test->foo(); // Catchable fatal error: The returned value must be of the type integer 
 +</code> 
 + 
 +<code php> 
 +interface ITest { 
 + public function (int) foo();  
 +
 + 
 +class foo implements ITest { 
 + public function foo() { 
 + return 1; 
 + }  
 +
 + 
 +$test = new foo; 
 +$test->foo(); // Fatal error: Declaration of foo::foo() must be compatible with that of ITest::foo() 
 +</code> 
 + 
 +=== Trying use with magic methods === 
 +<code php> 
 +class test { 
 + // Fatal error: Return type hint can't be used with magic methods 
 + public function (int) __toString() { 
 +
 +
 +</code> 
 + 
 +=== PHP types === 
 +<code php> 
 +function (int) test($value) { 
 + return $value; 
 +
 + 
 +test('1337'); // Catchable fatal error: The returned value must be of the type integer 
 +</code> 
 + 
 + 
 +===== Parameter type hint ===== 
 + 
 +==== BC Break ====
  
-===== BC Break ===== 
 == New tokens (new keywords) == == New tokens (new keywords) ==
   - T_INTEGER (Keywords: int, integer)   - T_INTEGER (Keywords: int, integer)
Line 14: Line 114:
   - T_STR (Keyword: string)   - T_STR (Keyword: string)
  
 +==== Other changes ====
 +  - Removed ZEND_ARG_ARRAY_INFO()
 +  - Added ZEND_ARG_PHP_TYPE_INFO()
 +<code diff u>
 +-#define ZEND_ARG_ARRAY_INFO(pass_by_ref, name, allow_null) { {#name}, sizeof(#name)-1, {NULL}, 0, 1, allow_null, pass_by_ref, 0, 0 },
 ++#define ZEND_ARG_PHP_TYPE_INFO(pass_by_ref, name, php_type, allow_null) { {#name}, sizeof(#name)-1, {NULL}, 0, php_type, allow_null, pass_by_ref, 0, 0 },
 +</code>
 +  - **Reflection**: ReflectionParameter class:
 +    - Added:
 +      - isInt()
 +      - isDouble()
 +      - isBool()
 +      - isString()
 +      - isObject()
 +      - isResource()
 +
 +
 +
 +==== Examples ====
 +
 +=== With default parameter value ===
 +<code php>
 +function test(integer $value = '1') {
 +}
 +// Fatal error: Default value for parameters with integer type hint can only be the exact type or NULL
 +</code>
  
-===== Parameter type hint - Examples ===== 
 === integer / int === === integer / int ===
 <code php> <code php>
Line 22: Line 147:
  
 test(1); test(1);
-test("1337"); 
 test(-1); test(-1);
-test("1."); // Catchable fatal error: Argument 1 passed to test() must be an integer, string given +test("1.");  
- +// Catchable fatal error: Argument 1 passed to test() must be of the type integer, string given ...
-function test(integer $value = '1') { +
-+
-// Fatal error: Default value for parameters with integer type hint can only be the exact type or NULL+
 </code> </code>
  
Line 38: Line 159:
 test(1.1); test(1.1);
 test(.1); test(.1);
-test("1."); +test("1."); // Catchable fatal error: Argument 1 passed to test() must be of the type double, string given
-test("1337"); // Catchable fatal error: Argument 1 passed to test() must be an double, string given +
- +
-function test(double $value = '1') { +
-+
-// Fatal error: Default value for parameters with double type hint can only be the exact type or NULL+
 </code> </code>
  
Line 52: Line 168:
  
 test(false); test(false);
-test(0); +test(0); // Catchable fatal error: Argument 1 passed to test() must be of the type boolean, null given
-test(1); +
-test('0'); +
-test('1'); +
-test(''); +
-test(null); // Catchable fatal error: Argument 1 passed to test() must be an boolean, null given+
 </code> </code>
  
Line 66: Line 177:
  
 test(fopen(__FILE__, 'r')); test(fopen(__FILE__, 'r'));
-test(NULL); // Catchable fatal error: Argument 1 passed to test() must be an resource, null given+test(NULL); // Catchable fatal error: Argument 1 passed to test() must be of the type resource, null given
 </code> </code>
  
Line 75: Line 186:
  
 test(new stdclass); test(new stdclass);
-test(NULL); // Catchable fatal error: Argument 1 passed to test() must be an object, null given +test(NULL); // Catchable fatal error: Argument 1 passed to test() must be of the type object, null given
- +
-function test(object $value = 1) { +
-+
-// Fatal error: Default value for parameters with object type hint can only be the exact type or NULL+
 </code> </code>
  
  
-===== Proposal and Patch ===== 
  
-Parameter type hint: +===== Patches & tests =====
  
 +  - Return value type hint: http://felipe.ath.cx/diff/return_type_hint.diff
 +  - Parameter type hint: http://felipe.ath.cx/diff/param_type_hint.diff
 +  - Tests: http://felipe.ath.cx/diff/tests/
  
rfc/typehint.txt · Last modified: 2017/09/22 13:28 by 127.0.0.1