Re: about __get,__set Overloading, read-only properties

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



pleae don't reply to an existing thread when posting a new question.

ked schreef:
> Hi. all , 
> 
> I got a article from php 5.0 manual's comments. It's useful, offer readonly
> properties for classes. 
> 
> (look at the end of this message for  the article )
> 
> find out  function __construct(), I want to modify $this->id in it , then I
> got a  "readonly" Exception (defined in "__set" function).  
> 
> Distinctly, a read-only property could not be change via "$obj->attribute =
> '' " ,
>  but is could be change via $this->id='',  inside of  class , isn't it ?
> 
>  How to modify __set function ?  

don't - let __set() be the policeman it's supposed to be.
either create a private function to initialize values or set the values
directly in the array

private function init($k, $v)
{
	if (isset($this->p_arrPublicProperties[$k]))
		$this->p_arrPublicProperties[$k]['value'] = $v;
}

> 
> thanks for any advises.
> 
> regards!
> ked
> 
> 
> the article is here: 
> ----------------------------------------------------------------------------
> ------------------------
> Eric Lafkoff (22-Feb-2006 02:56)
> 
> If you're wondering how to create read-only properties for your class, the
> __get() and __set() functions are what you're looking for. You just have to
> create the framework and code to implement this functionality. 
> Here's a quick example I've written. This code doesn't take advantage of the
> "type" attribute in the properties array, but is there for ideas.
> <?php
> class Test 
> {
> private $p_arrPublicProperties = array(
> 	"id" => array("value" => 4,"type" => "int","readonly" => true),
> 	"datetime" => array("value" => "Tue 02/21/2006 20:49:23","type" =>
> "string", "readonly" => true),
> 	"data" => array("value" => "foo", "type" => "string", "readonly" =>
> false)
> );
> 
> //ked add!!!!!!!
> public function __construct()
> {
> 	$this->id = 100; //----------------------------will get  exception
> !!
> }
> 
> private function __get($strProperty) {
> //Get a property:
> if (isset($this->p_arrPublicProperties[$strProperty])) {
> return $this->p_arrPublicProperties[$strProperty]["value"];
> } else {
> throw new Exception("Property not defined");
> return false;
> }
> }
> 
> private function __set($strProperty, $varValue) {
> //Set a property to a value:
> if (isset($this->p_arrPublicProperties[$strProperty])) {
> //Check if property is read-only:
> if ($this->p_arrPublicProperties[$strProperty]["readonly"]) {
> throw new Exception("Property is read-only");
> ///////////////////////////////////---------------note here
> return false;
> } else {
> $this->p_arrPublicProperties[$strProperty]["value"] = $varValue;
> return true;
> }
> } else {
> throw new Exception("Property not defined");
> return false;
> }
> }
> 
>    private function __isset($strProperty) {
>     //Determine if property is set:
>     return isset($this->p_arrPublicProperties[$strProperty]);
>    }
>    
>    private function __unset($strProperty) {
>     //Unset (remove) a property:
>     unset($this->p_arrPublicProperties[$strProperty]);
> } 
> 
> }
> $objTest = new Test();
> print $objTest->data . "\n";
> $objTest->data = "bar"; //Works.
> print $objTest->data;
> $objTest->id = 5; //Error: Property is read-only.
> ?>
> 

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


[Index of Archives]     [PHP Home]     [Apache Users]     [PHP on Windows]     [Kernel Newbies]     [PHP Install]     [PHP Classes]     [Pear]     [Postgresql]     [Postgresql PHP]     [PHP on Windows]     [PHP Database Programming]     [PHP SOAP]

  Powered by Linux