On Mon, Aug 25, 2008 at 11:01 AM, Richard Heyes <[EMAIL PROTECTED]> wrote:
>>> Curious. Which do you prefer and why?
>
> Accessor methods. They allow for changes in the future that may well
> be unforeseen at the moment. Or at least that would be my response
> with PHP4. Now with the __get and __set built-in accessors, that's
> pretty much taken care of.
>
>> I access directly to avoid pointless method calls for reads.  It'd be
>> nice if there were a way to define a public read-only mode,
>
> Not tried this, but you may be able to do it with a __get method that
> doesn't return anything.
>
> --
> Richard Heyes
> http://www.phpguru.org
>

Oh it'd be possible, but all this does is distract me from the purpose
of my code.  I am easily distracted though seeing as I'm writing this
out in the first place!  :)  A simple note in the docs saying this is
read only is enough for me.  You'd have to put a note in there about
how it will throw an exception upon write anyways.  *shrug*  But again
these are very specific pieces of code that are getting public
properties.

This goes in line with all the other coding practices I try to use.
Registry over singleton, notification queue over direct observer, etc.
 Let something else do the heavy lifting when possible.


class readonlytest {

        private $readonly = array('meh');
        private $meh = 'meh value';
        public $blah;
        
        private function __get($name) {
                if (in_array($name, $this->readonly)) {
                        return $this->{$name};
                }
        }
        
        private function __set($name, $value) {
                if (in_array($name, $this->readonly)) {
                        throw new Exception("The property {$name} is read 
only");
                }
                $this->{$name} = $value;
        }

}

$test = new readonlytest;

echo "Pre-blah:";
var_dump($test->blah);
$test->blah = 'blah';
echo "Post-blah:";
var_dump($test->blah);

echo "Reading meh:";
var_dump($test->meh);
try {
        $test->meh = 'meh';
} catch (Exception $e) {
        echo "Exception:";
        var_dump($e);
}
var_dump($test->meh);

But why would I want to clutter up my class with that nonsense?

Output:

Pre-blah:
null
Post-blah:
string 'blah' (length=4)
Reading meh:
string 'meh value' (length=9)
Exception:
object(Exception)[2]
  protected 'message' => string 'The property meh is only' (length=24)
  private 'string' => string '' (length=0)
  protected 'code' => int 0
  protected 'file' => string '/Users/eric/Sites/blah.php' (length=26)
  protected 'line' => int 18
  private 'trace' =>
    array
      0 =>
        array
          'file' => string '/Users/eric/Sites/blah.php' (length=26)
          'line' => int 36
          'function' => string '__set' (length=5)
          'class' => string 'readonlytest' (length=12)
          'type' => string '->' (length=2)
          'args' =>
            array
              0 => string 'meh' (length=3)
              1 => string 'meh' (length=3)
string 'meh value' (length=9)

-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to