|
Posted by Marek Kilimajer on 04/05/05 11:02
C Drozdowski wrote:
> Howdy,
>
> I'd like to access some of the private members of my classes as
> read-only properties without resorting to function calls to access them.
> (e.g. $testClass->privateMember instead of $testClass->privateMember(),
> etc)
>
> Based on my research and testing, using the __get and __set overloading
> methods appears to be the only way to do so. It also, based on testing,
> appears that these private members must be in an array.
>
> What I do not understand is that if I declare a __get method I MUST also
> declare a "do nothing" __set method to prevent the read-only properties
> from being modified in code that uses the class.
>
> For example, the code below allows me to have read-only properties.
> However, if I remove the "do nothing" __set method completely, then the
> properties are no longer read-only.
>
> I'm curious as to why I HAVE to implement the __set method?
>
> Example:
>
> <?php
>
> class testClass
> {
> private $varArray = array('one'=>'ONE', 'two'=>'TWO');
>
> public function __get($name)
> {
> if (array_key_exists($name, $this->varArray)) {
> return $this->varArray[$name];
> }
> }
>
> public function __set($name, $value)
> {
> }
>
> }
>
> $test = new testClass();
>
> $test->one = 'TWO'; // doesn't work
> echo $test->one; // echo s 'ONE'
>
> ?>
>
If __set function is not created, line $test->one = 'TWO'; creates a new
public variable with name 'one' and this one is echoed on the next line,
not the one retrieved from __get.
__get is called only for class variables that do not exist.
[Back to original message]
|