rfc:locked-classes

Differences

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

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
rfc:locked-classes [2019/03/10 18:29] imsoprfc:locked-classes [2019/06/04 18:56] (current) – Withdrawn imsop
Line 3: Line 3:
   * Date: 2019-03-10   * Date: 2019-03-10
   * Author: Rowan Collins [IMSoP], rowan.collins@gmail.com   * Author: Rowan Collins [IMSoP], rowan.collins@gmail.com
-  * Status: Draft+  * Status: Withdrawn
   * First Published at: http://wiki.php.net/rfc/locked-classes   * First Published at: http://wiki.php.net/rfc/locked-classes
  
Line 13: Line 13:
  
 Changing this behaviour for all objects would be a significant change to the language, with the potential to break a large amount of existing code. However, code written with no intention of using this dynamic behaviour would benefit from a way to switch it off. Changing this behaviour for all objects would be a significant change to the language, with the potential to break a large amount of existing code. However, code written with no intention of using this dynamic behaviour would benefit from a way to switch it off.
 +
 +While this can be achieved through strategic use of the ''%%__set%%'', ''%%__get%%'', and ''%%__unset%%'' magic methods, this is long-winded, hard to optimise, and interferes with other uses of those methods.
  
 ===== Proposal ===== ===== Proposal =====
Line 90: Line 92:
 The following additions will be made to expose the new flag via reflection: The following additions will be made to expose the new flag via reflection:
  
-* New constant ReflectionClass::IS_LOCKED to expose the bit flag used for locked classes +  * New constant ReflectionClass::IS_LOCKED to expose the bit flag used for locked classes 
-* The return value of ReflectionClass::getModifiers() will have this bit set if the class being reflected is locked +  * The return value of ReflectionClass::getModifiers() will have this bit set if the class being reflected is locked 
-* Reflection::getModifierNames() will include the string "locked" if this bit is set +  * Reflection::getModifierNames() will include the string "locked" if this bit is set 
-* A new ReflectionClass::isLocked() method will allow directly checking if a class is locked+  * A new ReflectionClass::isLocked() method will allow directly checking if a class is locked
  
 ===== Unaffected PHP Functionality ===== ===== Unaffected PHP Functionality =====
Line 107: Line 109:
 A pull request containing an initial implementation with basic tests is available on github: https://github.com/php/php-src/pull/3931 A pull request containing an initial implementation with basic tests is available on github: https://github.com/php/php-src/pull/3931
  
-===== Implementation ===== +===== Reasons for Withdrawal ===== 
-TODO: After the project is implemented, this section should contain  + 
-  - the version(s) it was merged into +This RFC was discussed on the Internals list in March 2019. See archive here: https://externals.io/message/104620 
-  - a link to the git commit(s) + 
-  - a link to the PHP manual entry for the feature +While the reasoning behind the feature was welcomed, the general consensus was that it was not quite right in its current form. 
-  - a link to the language specification section (if any)+ 
 +Specific concerns raised included:
  
-===== References ===== +  * The handling of ''%%__set%%'', ''%%__get%%'', and ''%%__unset%%'' on locked classes is unnecessarily complicated. Perhaps these should just be prohibited instead. 
-TODO+  * The restriction on ''unset()'' prevents clearing of reference bindings set with ''$foo->bar =& $baz''. One possibility is to reset the property to ''null'', but not remove it from the list of properties on the object. 
 +  * Contrary to both of the above suggestions, there was interest in using locked classes with "lazy-loading", where properties are deliberately removed to trigger ''%%__unset%%''
 +  * The extra keyword was considered "ugly" by some. While subjective, this does point to a lack of long-term vision: if nearly all PHP classes should behave this way, requiring the boilerplate on each declaration is cumbersome. 
 +  * If the primary purpose is to prevent //accidental// use of dynamic properties, the flag would be better set where the object is //used// (e.g. with a ''declare()'' flag) rather than where it is //defined//. That way, use of third-party objects can be subject to strict checking without modifying shared code; and deliberate "trap doors" can be used to implement tricks that rely on dynamic properties.
  
-===== Rejected Features ===== +The feature proposed in this RFC was deliberately conservative to keep the implementation simple, and bring it to users as soon as possible. However, it may be sensible to revisit the idea in combination with other concepts, such as packages/namespace-scoped declares, and a roadmap for making strictness the default.
-None yet+
rfc/locked-classes.1552242548.txt.gz · Last modified: 2019/03/10 18:29 by imsop