|   | php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login | 
| 
  [2009-09-11 01:02 UTC] president at basnetworks dot net
 Description:
------------
I would like to request a C# style get/set syntax (called a property in C#) for PHP.  Basically, it looks and acts like a class member/variable from outside the class, but it is actually a set of two methods.  It can be used to provide only read or write access to a class member, do pre or post processing on a member, or be completely dynamic like a set of class methods.
A property contains two methods between braces, named get and set.  get must always have a return statement, while set has a magic variable "value" or "$value" which is the variable that was passed to the property.  Either method can be omitted to make the property read-only or write-only.
The same effect can be achieved by creating a GetVar() and SetVar() method to create a sudo-property "var", although it is by far much clumsier and less intuitive.
I also realize the same effect received outside the class can be achieved using the __get() and __set() methods, but these methods are only really useful in a small instance of situations, like giving access to an internal array as though each index is a property.  These magic methods are not at all useful for using on an individual property basis, and it gets worse when inheritance is introduced.
The C# syntax is as follows:
class TimePeriod
{
    private double seconds;
    public double Hours
    {
        get { return seconds / 3600; }
        set { seconds = value * 3600; }
    }
}
The PHP syntax would be similar to the following:
class TimePeriod
{
    private $seconds;
    public property Hours
    {
        get { return $this->seconds / 3600; }
        set { $this->seconds = $value * 3600; }
    }
}
You would use it exactly the same as a public class member:
$time = new TimePeriod();
$time->Hours = 24;
echo $time->Hours;
As opposed to the alternative:
$time = new TimePeriod();
$time->SetHours(24);
echo $time->GetHours();
Additionally, the get and set methods can have separate visibilities like in the following example where get is public and set is protected:
public property Name
{
    get { return $this->name; }
    protected set { $this->name = $value; }
}
There is another ticket that is similar but not the same thing here:
http://bugs.php.net/bug.php?id=34194
It suggests separate getter/setter methods, which in my opinion are much less intuitive.  I believe that following the C# format would help to keep a standard format, and would be the least confusing.
The poster of that bug also fails to realize that separate visibility levels can be achieved for properties using the C# syntax, as shown above.
The C# documentation on properties is available here:
http://msdn.microsoft.com/en-us/library/x9fsa0sw%28VS.80%29.aspx
The C# documentation on Asymmetric Accessor Accessibility for properties is available here:
http://msdn.microsoft.com/en-us/library/75e8y5dd%28VS.80%29.aspx
Patchesv2.2 (last revision 2011-12-12 03:55 UTC by php-dev at zerocue dot com)v2.1 (last revision 2011-12-12 00:17 UTC by php-dev at zerocue dot com) accessor_v2.diff (last revision 2011-12-11 19:20 UTC by php-dev at zerocue dot com) Pull RequestsHistoryAllCommentsChangesGit/SVN commits             | |||||||||||||||||||||||||||||||||||||
|  Copyright © 2001-2025 The PHP Group All rights reserved. | Last updated: Fri Oct 31 02:00:02 2025 UTC | 
I also recommend this but i have a little idea too: 1. Most of the time i use get<VariableName>() syntax and I have to write new functions for that (or using __call or __set), because i protect the properties with private or protected to protect for writing them. 2. Most of all the code is ugly or has limitations using readonly/writeonly properties with __get(&$v) or __set($v,&$c) by reference. 3. It is not perfectly clean to write less code with __get or getter/setter if only want to protecting them... And less code matters! I would like to see a new, or 2 new keywords, e.g. "readonly" and "writonly", because the code will look smoother and i dont have to make the use of magic methods... Or some own designed errors for that... Now an simple example: ====================== <?php class A { /** the following syntax is just invented **/ static readable protected $foo = 1; static writable protected $bar = 2; } A::$foo++; // raises error "variable is not writeable from this context" echo(A::$foo); // will simple echo $foo A::$bar++; // will increment $bar to 3 echo(A::$bar); // raises error "variable is not readable from this context" ?> ( what about is_readable() or is_writable() for that? ) I dont think that these functions will be used, so only Reflection should be extended... and now, instead of the current syntax: ====================================== <?php class A { static protected $foo = 1; static protected $bar = 1; function __get($v) { if ($v == 'bar') { trigger_error('$bar is not readble from this context',E_USER_ERROR); } return $this->$v; } function __set($v, $c) { if ($v == 'foo') { trigger_error('$foo is not writable from this context',E_USER_ERROR); } $this->$v = $c; return true; } } ?> get/set syntax will be nice but also nasty if only read/writablity is desired... this can be confusing as this: ============================== <?php class A { /** the following syntax is just invented **/ static protected $foo { function __get() { return $this->foo; } function __set() { trigger_error('$foo is not writable from this context',E_USER_ERROR); } } = 1; static protected $bar { function __get() { trigger_error('$bar is not readable from this context',E_USER_ERROR); } function __set() { $this->bar = 1; return true; } } = 2; } ?> think about it... many developers will waive the old way or functions like getVarname and setVarname... and for all other, getter/setter will be nice as described in the rfc...