rfc:propertygetsetsyntax
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
rfc:propertygetsetsyntax [2010/04/25 00:46] – Added further clarification to the "What about the readonly keyword?" section description, and added a code example. lieutenantclone | rfc:propertygetsetsyntax [2017/09/22 13:28] (current) – external edit 127.0.0.1 | ||
---|---|---|---|
Line 1: | Line 1: | ||
====== Request for Comments: Property get/set syntax ====== | ====== Request for Comments: Property get/set syntax ====== | ||
- | * Version: 0.1 | + | * Version: 0.3 |
* Date: 2009-09-13 | * Date: 2009-09-13 | ||
* Author: Dennis Robinson < | * Author: Dennis Robinson < | ||
Line 161: | Line 161: | ||
private $seconds; | private $seconds; | ||
+ | // Properties are implemented using the " | ||
public property Hours | public property Hours | ||
{ | { | ||
Line 174: | Line 175: | ||
$time-> | $time-> | ||
echo $time-> | echo $time-> | ||
+ | </ | ||
+ | |||
+ | Note that " | ||
+ | |||
+ | **__Alternative Syntax__** | ||
+ | |||
+ | The syntax above attempts to match the syntax of C# properties, as well as PHP method declarations as much as possible. | ||
+ | |||
+ | <code php> | ||
+ | class TimePeriod | ||
+ | { | ||
+ | private $seconds; | ||
+ | |||
+ | // Looks less like a function and more like a class member | ||
+ | // This creates yet another property syntax by moving away from the C# syntax too much | ||
+ | public $Hours | ||
+ | { | ||
+ | get { return $this-> | ||
+ | set { $this-> | ||
+ | };// Note the semi-colon here | ||
+ | }; | ||
+ | </ | ||
+ | |||
+ | In this syntax, a semi-colon exists at the end of the property definition. | ||
+ | |||
+ | **__Alternative Syntax Suggested By jbondc__** | ||
+ | |||
+ | <code php> | ||
+ | property Hours { | ||
+ | get { return $this-> | ||
+ | set { $this-> | ||
+ | } | ||
+ | |||
+ | class TimePeriod | ||
+ | { | ||
+ | private $seconds; | ||
+ | |||
+ | public [Hours] $hours; | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | This syntax would favor re-use similar to traits by injecting the set/get code. | ||
+ | |||
+ | The implementation would add the keywords ' | ||
+ | |||
+ | A read-only property could be defined in the following ways: | ||
+ | |||
+ | <code php> | ||
+ | // Spl property | ||
+ | property readonly | ||
+ | final set { throw Exception(__PROPERTY__ . " is read-only." | ||
+ | } | ||
+ | |||
+ | // Read-only property #1 | ||
+ | property MyHours1 extends Hours { | ||
+ | use readonly; | ||
+ | } | ||
+ | |||
+ | // Read-only property #2 | ||
+ | property MyHours2 extends Hours { | ||
+ | set { throw Exception(__PROPERTY__ . " is read-only." | ||
+ | } | ||
+ | |||
+ | // Read-only property #3 (if you don't want an exception) | ||
+ | property MyHours3 extends Hours { | ||
+ | set { trigger_error(__PROPERTY__ . " is read-only.", | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Another approach, to reserve the ' | ||
+ | |||
+ | <code php> | ||
+ | // property as some kind of trait | ||
+ | class TimePeriod | ||
+ | { | ||
+ | private $seconds; | ||
+ | |||
+ | public {use Hours;} $hours; | ||
+ | } | ||
</ | </ | ||
Line 194: | Line 274: | ||
public property Minutes | public property Minutes | ||
{ | { | ||
- | set { $this->minutes | + | set { $this->seconds |
} | } | ||
}; | }; | ||
Line 262: | Line 342: | ||
Interfaces may define property declarations, | Interfaces may define property declarations, | ||
- | When a class implements an interface that has a read-only property, it can add in a set method to turn the property into a read-write property. | + | When a class implements an interface that defines |
<code php> | <code php> | ||
Line 287: | Line 367: | ||
==== Overloading Properties ==== | ==== Overloading Properties ==== | ||
- | Properties can be overloaded in extending classes. | + | Properties can be overloaded in extending classes. |
<code php> | <code php> | ||
Line 327: | Line 407: | ||
public property Minutes | public property Minutes | ||
{ | { | ||
- | // A set method is adding, turning this property into a read-write property instead of read-only | + | // A set method is added, turning this property into a read-write property instead of read-only |
set { $this-> | set { $this-> | ||
} | } | ||
Line 333: | Line 413: | ||
public property Milliseconds | public property Milliseconds | ||
{ | { | ||
- | // A property method can be made more visible | + | // A property method can have its visibility increased |
- | // This method is now public instead of private | + | // This method is now public instead of protected |
public set | public set | ||
{ | { | ||
- | // You can access a base class property explicitly, just like accessing a base class member or method | + | // You can access a base class property explicitly, just like accessing a base class member or method |
TimePeriod:: | TimePeriod:: | ||
} | } | ||
Line 346: | Line 426: | ||
==== Final Properties ==== | ==== Final Properties ==== | ||
- | Properties declared final are not able to be overloaded in a child class, just like final methods. | + | Properties declared final are not allowed |
<code php> | <code php> | ||
Line 359: | Line 439: | ||
} | } | ||
}; | }; | ||
- | </ | ||
- | <code php> | ||
class HalfTimePeriod extends TimePeriod | class HalfTimePeriod extends TimePeriod | ||
{ | { | ||
Line 370: | Line 448: | ||
{ | { | ||
get { return ($this-> | get { return ($this-> | ||
+ | } | ||
+ | }; | ||
+ | </ | ||
+ | |||
+ | **__Final property methods__** | ||
+ | |||
+ | The get or set method of a property can be declared " | ||
+ | |||
+ | <code php> | ||
+ | class TimePeriod | ||
+ | { | ||
+ | private $seconds; | ||
+ | |||
+ | // Notice there is no " | ||
+ | public property Hours | ||
+ | { | ||
+ | final get { return $this-> | ||
+ | set { $this-> | ||
+ | } | ||
+ | }; | ||
+ | |||
+ | class HalfTimePeriod extends TimePeriod | ||
+ | { | ||
+ | private $seconds; | ||
+ | |||
+ | public property Hours | ||
+ | { | ||
+ | get { return ($this-> | ||
+ | // because it was declared final in the base class | ||
+ | set ( $this-> | ||
} | } | ||
}; | }; | ||
Line 392: | Line 500: | ||
<code php> | <code php> | ||
- | // Accessing | + | // Accessing |
TimePeriod:: | TimePeriod:: | ||
echo TimePeriod:: | echo TimePeriod:: | ||
</ | </ | ||
+ | |||
+ | ===== Implementation ===== | ||
+ | |||
+ | An implementation of this proposal is being worked on by Clint Priest <phpdev at zerocue dot com> | ||
===== References ===== | ===== References ===== | ||
Line 409: | Line 521: | ||
* [[http:// | * [[http:// | ||
* [[http:// | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
===== Changelog ===== | ===== Changelog ===== | ||
Line 420: | Line 536: | ||
- 2010-04-24 Dennis Robinson: Fleshed out the "The Current Solution" | - 2010-04-24 Dennis Robinson: Fleshed out the "The Current Solution" | ||
- 2010-04-24 Dennis Robinson: Added further clarification to the "What about the readonly keyword?" | - 2010-04-24 Dennis Robinson: Added further clarification to the "What about the readonly keyword?" | ||
+ | - 2010-04-24 Dennis Robinson: Added an alternative syntax. | ||
+ | - 2010-04-24 Dennis Robinson: Added an example of property methods being marked final individually. | ||
+ | - 2010-11-13 Dennis Robinson: Added a note below the basic syntax about new keywords being created. | ||
+ | - 2010-11-13 Dennis Robinson: Added a semicolon to the " | ||
+ | - 2010-11-29 jbondc: Added another alternative syntax | ||
+ | - 2010-12-01 Dennis Robinson: Added additional links in the " | ||
+ | - 2011-12-22 Dennis Robinson: Added " |
rfc/propertygetsetsyntax.1272156385.txt.gz · Last modified: 2017/09/22 13:28 (external edit)