ID:          46506
 Comment by:  mickael at lupusmic dot org
 Reported By: glideraerobatics at hotmail dot com
 Status:      Open
 Bug Type:    Feature/Change Request
 PHP Version: 5.3.0alpha2
 New Comment:

I guess the readonly keyword in C# is wrong. It hasn't to disallow
variance of the attribute, but the setting from outside the object.
Readonly is opposite to constness of a variable. For example,
DOMDocument::doctype isn't constant.

What you think about, it's a dynamic const attribute, in opposite to
static one.

So said, a readonly is like a const attribute, but isn't. And it
doesn't deserve a scope qualifier, it can only be public.

For example :

class thing
{
        readonly        $status = 'instantiation' ;

        public          function __construct()
        {
                // do init stuff

                $this->status = 'instantiate' ;
        }

        public          function invalidate()
        {
                // do stuf
                $this->status = 'invalid' ;
        }
}

// Usage
$o = new thing ;
echo $o->status ; // display 'instantiation'
$o->status = 'forced' ; // throw an error E_FATAL

$o->invalidate() ; // do stuff then set readonly status attribute


Previous Comments:
------------------------------------------------------------------------

[2008-11-06 14:11:42] glideraerobatics at hotmail dot com

Description:
------------
Here is a description of this feature in C#:
http://blog.paranoidferret.com/index.php/2007/09/12/csharp-tutorial-the-readonly-keyword/

In a nutshell it allows you to create classes with public variables
that are readonly and can only be written to / initialized by the
contructor of the class itself.

This allows the creation of simple objects without having using
accessor methods to protect the internal data that was validated and
initialized during construction from corruption.

Note: bug http://bugs.php.net/bug.php?id=39467 is about a similar
problem but the proposed solution is not quite right.

Reproduce code:
---------------
class Person
{
  public readonly $name = null;
  public readonly $age = null;
  public readonly $weight = null;

  public function __construct($name, $age, $weight) {
  {
    if (!isAgeToWeightRatioSane($age, $weight)) {
      throw new InvalidArgumentException("Invalid age to weight ratio:
$age : $weight");
    }
    // TODO: other sanity checks here.
    $this->name = $name;
    $this->age = $age;
    $this->weight = $weight;
  }
}


$person = new Person('Joe', 22, 100);

$person->age = 33; // throws a yet to be named exception





------------------------------------------------------------------------


-- 
Edit this bug report at http://bugs.php.net/?id=46506&edit=1

Reply via email to