rfc:protectedlookup
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revisionLast revisionBoth sides next revision | ||
rfc:protectedlookup [2008/06/01 10:51] – robinf | rfc:protectedlookup [2014/04/08 23:02] – Inactive levim | ||
---|---|---|---|
Line 3: | Line 3: | ||
* Date: 2008-06-01 | * Date: 2008-06-01 | ||
* Author: Robin Fernandes < | * Author: Robin Fernandes < | ||
- | * Status: | + | |
+ | | ||
Line 157: | Line 158: | ||
?> | ?> | ||
</ | </ | ||
+ | |||
===== Some Details ===== | ===== Some Details ===== | ||
- | The new lookup rule is implemented | + | The new lookup rule is implemented by using '' |
<code c> | <code c> | ||
| | ||
Line 175: | Line 177: | ||
Remove new rule: remove calls to zend_get_function_root_class(). | Remove new rule: remove calls to zend_get_function_root_class(). | ||
=== Patch === | === Patch === | ||
- | [[http:// | + | * [[http:// |
+ | * [[http:// | ||
=== Pros === | === Pros === | ||
* Simple code change | * Simple code change | ||
Line 209: | Line 212: | ||
If option 1 is dismissed due to the violation of LSP, it follows that the current rules for property access, callbacks, '' | If option 1 is dismissed due to the violation of LSP, it follows that the current rules for property access, callbacks, '' | ||
=== Patch === | === Patch === | ||
- | To do. | + | * [[http:// |
+ | * [[http:// | ||
=== Pros === | === Pros === | ||
* Respects the Liskov Substitution Principle. | * Respects the Liskov Substitution Principle. | ||
Line 216: | Line 220: | ||
* The protected modifier loses its intuitive/ | * The protected modifier loses its intuitive/ | ||
| | ||
+ | |||
==== Option 3 ==== | ==== Option 3 ==== | ||
This approach is similar to option 2, but modifies the new rule slightly so as to preserve the intuitive meaning of the protected modifier. Lookups of protected members on sibling classes fall back to the declaration from the common ancestor class, if available. To illustrate: | This approach is similar to option 2, but modifies the new rule slightly so as to preserve the intuitive meaning of the protected modifier. Lookups of protected members on sibling classes fall back to the declaration from the common ancestor class, if available. To illustrate: | ||
Line 241: | Line 246: | ||
</ | </ | ||
=== Patch === | === Patch === | ||
- | | + | * Patch to do. |
+ | * [[http:// | ||
=== Pros === | === Pros === | ||
* Respects the Liskov Substitution Principle. | * Respects the Liskov Substitution Principle. | ||
Line 247: | Line 253: | ||
=== Cons === | === Cons === | ||
* Non-trivial code change | * Non-trivial code change | ||
- | * Possibly confusing at first, as code that reads C1::f() may in fact result in an invocation of P::f(). | + | * Possibly confusing at first, as code that reads C1::f() may in fact result in an invocation of P:: |
+ | <code php> | ||
+ | <?php | ||
+ | // Class P declares some private members. | ||
+ | class P { | ||
+ | private function f() { echo ' | ||
+ | public static function test() { | ||
+ | $c = new C; | ||
+ | $c-> | ||
+ | } | ||
+ | } | ||
+ | |||
+ | // Class C1 re-declares the " | ||
+ | class C extends P { | ||
+ | private function f() { echo ' | ||
+ | } | ||
+ | P::test(); | ||
+ | ?> | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ===== Appendix ===== | ||
+ | ==== Other potential LSP violations ==== | ||
+ | If Option 1 is rejected on the grounds of a breach of LSP, then other arguable violations of LSP should be reviewed too. | ||
+ | Below is a list of examples to be considered. | ||
+ | === Private static methods === | ||
+ | <code php> | ||
+ | <?php | ||
+ | class P { | ||
+ | | ||
+ | | ||
+ | |||
+ | | ||
+ | $class = get_class($liskov); | ||
+ | echo " | ||
+ | $liskov-> | ||
+ | echo " | ||
+ | $class:: | ||
+ | } | ||
+ | } | ||
+ | |||
+ | class C extends P { | ||
+ | | ||
+ | | ||
+ | } | ||
+ | |||
+ | P::test(new P); | ||
+ | P::test(new C); // Valid Liskov substitution - should this fail? | ||
+ | ?> | ||
+ | </ | ||
+ | === Private static properties === | ||
+ | <code php> | ||
+ | <?php | ||
+ | class P { | ||
+ | | ||
+ | | ||
+ | |||
+ | | ||
+ | $class = get_class($liskov); | ||
+ | echo " | ||
+ | echo $liskov-> | ||
+ | echo " | ||
+ | echo $class::$sa . " | ||
+ | } | ||
+ | } | ||
+ | |||
+ | class C extends P { | ||
+ | | ||
+ | | ||
+ | } | ||
+ | |||
+ | P::test(new P); | ||
+ | P::test(new C); // Valid Liskov substitution - should this fail? | ||
+ | ?> | ||
+ | </ |
rfc/protectedlookup.txt · Last modified: 2017/09/22 13:28 by 127.0.0.1