rfc:incompat_ctx
no way to compare when less than two revisions
Differences
This shows you the differences between two versions of the page.
Previous revisionNext revision | |||
— | rfc:incompat_ctx [2013/01/20 19:22] – [Request for Comments: Remove calls with incompatible Context] cataphract | ||
---|---|---|---|
Line 1: | Line 1: | ||
+ | ====== Request for Comments: Remove calls with incompatible Context ====== | ||
+ | An RFC for deprecating and removing < | ||
+ | * Version: 1.0 | ||
+ | * Date: 2012-07-30 | ||
+ | * Author: Gustavo Lopes | ||
+ | * Status: Voting phase | ||
+ | * First Published at: http:// | ||
+ | |||
+ | ===== Introduction ===== | ||
+ | |||
+ | This RFC proposes deprecating (in PHP 5.5) and removing (in the next version) the "< | ||
+ | |||
+ | ===== What this proposal is not about ===== | ||
+ | |||
+ | This proposal is not about removing static calls to instance methods or instance-like calls to static methods. | ||
+ | |||
+ | ===== The feature ===== | ||
+ | |||
+ | To be clear, the feature I'm proposing to remove is this: | ||
+ | |||
+ | <code php> | ||
+ | class A { | ||
+ | function foo() { var_dump(get_class($this)); | ||
+ | } | ||
+ | class B { | ||
+ | | ||
+ | } | ||
+ | $b = new B; | ||
+ | $b-> | ||
+ | </ | ||
+ | |||
+ | Internal methods cannot be called in this fashion. | ||
+ | |||
+ | ===== The Change ==== | ||
+ | |||
+ | Even though I think an error at call site would be the most useful to the user, the most sensible option is to just have < | ||
+ | |||
+ | <code php> | ||
+ | class A { function foo() {} } | ||
+ | A::foo(); // E_STRICT | ||
+ | </ | ||
+ | |||
+ | ===== Rationale ===== | ||
+ | |||
+ | Method implementations almost always assume that $this refers to an instance of a compatible type. When they are called with an incompatible < | ||
+ | |||
+ | Because this feature is surprising and little-known, | ||
+ | |||
+ | When combined with LSB, it can be even more difficult to identify. See https:// | ||
+ | |||
+ | |||
+ | ===== BC break ===== | ||
+ | |||
+ | The break should be minor. I very much doubt there are many lines of code that rely on this feature. It has been discouraged with an < | ||
+ | |||
+ | This feature, as noted in the [[http:// | ||
+ | |||
+ | 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 ===== | ||
+ | |||
+ | * 2012-07-30: Initial version | ||
+ | * 2012-01-20: Opened vote |
rfc/incompat_ctx.txt · Last modified: 2017/09/22 13:28 by 127.0.0.1