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