rfc:protectedlookup

Differences

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

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
rfc:protectedlookup [2008/06/03 13:37]
robinf fix typo in code sample
rfc:protectedlookup [2017/09/22 13:28] (current)
Line 4: Line 4:
   * Author: Robin Fernandes <​robinf@php.net>​   * Author: Robin Fernandes <​robinf@php.net>​
   * First Published at: http://​wiki.php.net/​rfc/​protectedlookup   * First Published at: http://​wiki.php.net/​rfc/​protectedlookup
-  * Status: ​in the works+  * Status: ​Draft (Inactive)
  
  
Line 177: 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://​thread.gmane.org/​gmane.comp.php.devel/​48176/​focus=48179|Patch from Felipe Pena]]+  * [[http://​thread.gmane.org/​gmane.comp.php.devel/​48176/​focus=48179|Patch from Felipe Pena]] 
 +  * [[http://​www.soal.org/​php/​protectedrfc/​protected_opt1_tests.zip|Tests]]
 === Pros === === Pros ===
   * Simple code change   * Simple code change
Line 211: Line 212:
 If option 1 is dismissed due to the violation of LSP, it follows that the current rules for property access, callbacks, ''​clone()''​ and ''​destruct()''​ are also violations of LSP and should be fixed. This option ensures that ''​zend_get_function_root_class()''​ is used consistently for all protected method checks, and implements equivalent functionality for protected property checks. If option 1 is dismissed due to the violation of LSP, it follows that the current rules for property access, callbacks, ''​clone()''​ and ''​destruct()''​ are also violations of LSP and should be fixed. This option ensures that ''​zend_get_function_root_class()''​ is used consistently for all protected method checks, and implements equivalent functionality for protected property checks.
 === Patch === === Patch ===
- To do.+  * [[http://​www.soal.org/​php/​protectedrfc/​protected_opt2.txt|Patch]] 
 +  * [[http://​www.soal.org/​php/​protectedrfc/​protected_opt2_tests.zip|Tests]]
 === Pros === === Pros ===
   * Respects the Liskov Substitution Principle.   * Respects the Liskov Substitution Principle.
Line 218: Line 220:
   * The protected modifier loses its intuitive/​documented meaning, since protected members may be accessible from siblings.   * The protected modifier loses its intuitive/​documented meaning, since protected members may be accessible from siblings.
   ​   ​
 +
 ==== 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 243: Line 246:
 </​code>​ </​code>​
 === Patch === === Patch ===
- ​To ​do.+  * Patch to do. 
 +  * [[http://​www.soal.org/​php/​protectedrfc/​protected_opt3_tests.zip|Tests]]
 === Pros === === Pros ===
   * Respects the Liskov Substitution Principle.   * Respects the Liskov Substitution Principle.
Line 249: 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::​f(). ​However, this behaviour would be comparable to existing behaviour when accessing re-declared private members of child classes. For example: 
 +<code php> 
 +<?php 
 +// Class P declares some private members. 
 +class P { 
 +  private function f() { echo '​P::​f()';​ } 
 +  public static function test() { 
 +    $c = new C; 
 +    $c->​f(); ​ // falls back to P::f() prints P::f() 
 +  } 
 +
 +  
 +// Class C1 re-declares the "​inherited"​ private members. 
 +class C extends P { 
 +  private function f() { echo '​C::​f()';​ } 
 +
 + 
 +P::​test();​ 
 +?> 
 +</​code>​ 
 + 
  
  
rfc/protectedlookup.1212500240.txt.gz · Last modified: 2017/09/22 13:28 (external edit)