rfc:typehint
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
rfc:typehint [2008/04/08 01:33] – BC Break section felipe | rfc:typehint [2017/09/22 13:28] (current) – external edit 127.0.0.1 | ||
---|---|---|---|
Line 3: | Line 3: | ||
* Date: 2008-04-07 | * Date: 2008-04-07 | ||
* Author: Felipe Pena < | * Author: Felipe Pena < | ||
- | * Status: Under Discussion | + | * Status: |
+ | |||
+ | |||
+ | ====== Details of implementation ====== | ||
+ | **Parameter type hint:** | ||
+ | - The behavior when the default parameter value is '' | ||
+ | **Both:** | ||
+ | - Binary and unicode string are specified by '' | ||
+ | |||
+ | ===== Return value type hint ===== | ||
+ | |||
+ | ==== BC Break ==== | ||
+ | No BC break using the " | ||
+ | |||
+ | |||
+ | ==== Examples ==== | ||
+ | |||
+ | === Using inside namespaces === | ||
+ | <code php> | ||
+ | namespace foo; | ||
+ | |||
+ | class test { } | ||
+ | |||
+ | class bar { | ||
+ | static public function (foo::test) testing($instance) { | ||
+ | return $instance; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | bar:: | ||
+ | bar:: | ||
+ | </ | ||
+ | |||
+ | === 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 | ||
+ | </ | ||
+ | |||
+ | === Interfaces === | ||
+ | |||
+ | <code php> | ||
+ | interface ITest { | ||
+ | public function (int) foo(); | ||
+ | } | ||
+ | |||
+ | class foo implements ITest { | ||
+ | public function (int) foo() { | ||
+ | return ' | ||
+ | } | ||
+ | } | ||
+ | |||
+ | $test = new foo; | ||
+ | $test-> | ||
+ | </ | ||
+ | |||
+ | <code php> | ||
+ | interface ITest { | ||
+ | public function (int) foo(); | ||
+ | } | ||
+ | |||
+ | class foo implements ITest { | ||
+ | public function foo() { | ||
+ | return 1; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | $test = new foo; | ||
+ | $test-> | ||
+ | </ | ||
+ | |||
+ | === 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() { | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | === PHP types === | ||
+ | <code php> | ||
+ | function (int) test($value) { | ||
+ | return $value; | ||
+ | } | ||
+ | |||
+ | test(' | ||
+ | </ | ||
+ | |||
+ | |||
+ | ===== 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, | ||
+ | +#define ZEND_ARG_PHP_TYPE_INFO(pass_by_ref, | ||
+ | </ | ||
+ | - **Reflection**: | ||
+ | - Added: | ||
+ | - isInt() | ||
+ | - isDouble() | ||
+ | - isBool() | ||
+ | - isString() | ||
+ | - isObject() | ||
+ | - isResource() | ||
+ | |||
+ | |||
+ | |||
+ | ==== Examples ==== | ||
+ | |||
+ | === With default parameter value === | ||
+ | <code php> | ||
+ | function test(integer $value = ' | ||
+ | } | ||
+ | // Fatal error: Default value for parameters with integer type hint can only be the exact type or NULL | ||
+ | </ | ||
- | ===== Parameter type hint - Examples ===== | ||
=== integer / int === | === integer / int === | ||
<code php> | <code php> | ||
Line 22: | Line 147: | ||
test(1); | test(1); | ||
- | test(" | ||
test(-1); | test(-1); | ||
- | test(" | + | test(" |
- | + | // Catchable fatal error: Argument 1 passed to test() must be of the type integer, string given ... | |
- | function test(integer $value = ' | + | |
- | } | + | |
- | // Fatal error: Default value for parameters with integer type hint can only be the exact type or NULL | + | |
</ | </ | ||
Line 38: | Line 159: | ||
test(1.1); | test(1.1); | ||
test(.1); | test(.1); | ||
- | test(" | + | test(" |
- | test(" | + | |
- | + | ||
- | function test(double $value = ' | + | |
- | } | + | |
- | // Fatal error: Default value for parameters with double type hint can only be the exact type or NULL | + | |
</ | </ | ||
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(' | + | |
- | test(' | + | |
- | test('' | + | |
- | test(null); // Catchable fatal error: Argument 1 passed to test() must be an boolean, null given | + | |
</ | </ | ||
Line 66: | Line 177: | ||
test(fopen(__FILE__, | test(fopen(__FILE__, | ||
- | 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 |
</ | </ | ||
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 | + | |
</ | </ | ||
- | ===== Proposal and Patch ===== | ||
- | Parameter type hint: | + | ===== Patches & tests ===== |
+ | - Return value type hint: http:// | ||
+ | - Parameter type hint: http:// | ||
+ | - Tests: http:// | ||
rfc/typehint.1207618418.txt.gz · Last modified: 2017/09/22 13:28 (external edit)