Richard Quadling wrote:
> I'd really like this feature to be part of PHP.
>
> I don't particularly like the use of what looks like a closure for the 
> set/get.
>
> I used to code in Delphi and I always like the way in which their
> properties were defined.
>
> Essentially, the setter and getter are normal methods which are cherry
> picked for a property [1].
>
> <?php
> class TimePeriod
> {
>     protected $seconds;
>
>     public property Hours read getHours write setHours;
>
>     protected function getHours()
>     {
>         return $this->seconds / 3600;
>     }
>
>     protected function setHours()
>     {
>         $this->seconds = $value * 3600;
>     }
>
>     // This property is read-only
>     public property Minutes read getMinutes;
>
>     protected function getMinutes()
>     {
>         return $this->seconds / 60;
>     }
>
>     public property Milliseconds read getMilliseconds write setMilliseconds;
>
>     public function getMilliseconds()
>     {
>         // This method is public
>         return $this->seconds * 60;
>     }
>
>     protected function setMilliseconds()
>     {
>         // This method is protected
>         $this->seconds = $value * 3600;
>     }
> }
>
> For me, the advantage here is that I can independently the methods
> from the property. If I want to force a subclass to implement a
> setter/getter, then I can abstract the function in the base class.
> Sure, some may say that I should be using an interface. I disagree as
> I probably don't want the methods to be public. Protected or even
> private and/or final.
>
> The classic example is one of shapes. Every shape has a public $area
> property, but the value would be provided by an abstract protected
> TShape::getArea(); method. I can also finalise them, so, for example,
> a triangle shape could have a final protected getArea() method and all
> sub classes of triangles (scalene, isosceles, equilateral) would not
> implement their own getArea() method.
>
> The downside is certainly that the code is more verbose than I would
> guess many people would like.
>
> Regards,
>
> Richard.
>
> [1] http://www.delphibasics.co.uk/RTL.asp?Name=Property

setMilliseconds() should have $value as parameter instead of a magic name.

What about allowing this syntax to attach the property to a variable?

For instance:

<?php
class TimePeriod
{
    protected $seconds;
    protected $minutes;
    protected $hours;

    public property Seconds read $seconds write setSeconds;
    public property Minutes read $seconds write setMinutes;
    public property Hours read $seconds write setHours;

    public function setSeconds($seconds)
    {
        if ($seconds >= 0 && $seconds < 60) $this->seconds = $seconds;
    }

    public function setMinutes($minutes)
    {
        if ($minutes >= 0 && $minutes < 60) $this->minutes = $minutes;
    }

    public function setHours($hours)
    {
        if ($hours >= 0 && $hours < 24) $this->hours = $hours;
    }

}

We only want to perform checks on write, so instead of writing the trivial 
getters, the property is set to the variable itself. Child classes could
reattach it to a function if needing more control.



-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to