rfc:incompat_ctx
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
rfc:incompat_ctx [2012/07/30 20:34] – The change cataphract | rfc:incompat_ctx [2017/09/22 13:28] (current) – external edit 127.0.0.1 | ||
---|---|---|---|
Line 5: | Line 5: | ||
* Date: 2012-07-30 | * Date: 2012-07-30 | ||
* Author: Gustavo Lopes | * Author: Gustavo Lopes | ||
- | * Status: | + | * Status: |
* First Published at: http:// | * First Published at: http:// | ||
Line 58: | Line 58: | ||
This feature can, however, be used to implement trait-like behavior, and I'm sure someone somewhere did such a thing. | This feature can, however, be used to implement trait-like behavior, and I'm sure someone somewhere did such a thing. | ||
+ | |||
+ | ===== Alternatives ===== | ||
+ | |||
+ | Using traits is perhaps the easiest and cleanest way to replace code that relies on the feature to be removed. Changing the code to use traits implies: 1) refactoring the instance methods called from incompatible contexts into a trait, 2) make the callers from incompatible contexts use the new trait, 3) change the call sites to use < | ||
+ | |||
+ | <code php> | ||
+ | <?php | ||
+ | class A { | ||
+ | function dumpClass() { | ||
+ | var_dump(get_class($this)); | ||
+ | } | ||
+ | } | ||
+ | class B { | ||
+ | function test() { | ||
+ | A:: | ||
+ | } | ||
+ | } | ||
+ | |||
+ | $a = new A; | ||
+ | $b = new B; | ||
+ | $a-> | ||
+ | $b-> | ||
+ | </ | ||
+ | |||
+ | would become: | ||
+ | |||
+ | <code php> | ||
+ | <?php | ||
+ | trait ATrait { | ||
+ | function dumpClass() { | ||
+ | var_dump(get_class($this)); | ||
+ | } | ||
+ | } | ||
+ | class A { | ||
+ | use ATrait; | ||
+ | } | ||
+ | class B { | ||
+ | use ATrait; | ||
+ | function test() { | ||
+ | $this-> | ||
+ | } | ||
+ | } | ||
+ | |||
+ | $a = new A; | ||
+ | $b = new B; | ||
+ | $a-> | ||
+ | $b-> | ||
+ | </ | ||
+ | |||
+ | A worse solution, which relies on the possibility of calling instance methods statically would be using an extra parameter: | ||
+ | |||
+ | <code php> | ||
+ | <?php | ||
+ | class A { | ||
+ | function dumpClass($obj=null) { | ||
+ | if ($obj === null) | ||
+ | $obj = $this; | ||
+ | var_dump(get_class($obj)); | ||
+ | } | ||
+ | } | ||
+ | class B { | ||
+ | function test() { | ||
+ | A:: | ||
+ | } | ||
+ | } | ||
+ | |||
+ | $a = new A; | ||
+ | $b = new B; | ||
+ | $a-> | ||
+ | $b-> | ||
+ | </ | ||
+ | |||
+ | ===== Vote ===== | ||
+ | |||
+ | Voting ends not before Monday, January 28th 2013. The PHP language is ultimately changed, so a 2/3 majority is required. | ||
+ | |||
+ | < | ||
+ | title=" | ||
+ | * Yes | ||
+ | * No | ||
+ | </ | ||
===== Changelog ===== | ===== Changelog ===== | ||
* 2012-07-30: Initial version | * 2012-07-30: Initial version | ||
+ | * 2013-01-20: Opened vote | ||
+ | * 2013-01-28: Closed vote; RFC accepted unanimously with 15 votes in favor |
rfc/incompat_ctx.1343680478.txt.gz · Last modified: 2017/09/22 13:28 (external edit)