about __get,__set Overloading, read-only properties

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

 



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 ?  

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