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

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

 



ked schreef:
>  My idea is just  your answer...happy..ing  ^_^ 
> 
> You are so warmhearted.  Thanks a lot!  : )

I don't get accused of that very often. are you being
sarcastic or did my suggestion help? (sorry I didn't quite
understand your reply)

> 
> I will never post a question to a existing thread .

good. that's one down 1,000,983 to go :-)

> 
>> -----Original Message-----
>> From: Jochem Maas [mailto:jochem@xxxxxxxxxxxxx] 
>> Sent: Friday, December 21, 2007 9:11 AM
>> To: ked
>> Cc: php-general@xxxxxxxxxxxxx
>> Subject: Re:  about __get,__set Overloading, read-only properties
>>
>> 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
>>
>>
>>
> 

-- 
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