类变量的默认值

时间:2011-06-24 14:48:54

标签: php class properties default

让我们说我有一个看起来像这样的课程:

class UserModel {
    private $_userData;
    function __construct($user_data){
          $this->_userData = $user_data;
    }
}

这就是这样称呼的:

$user = json_decode('{"name":"Neal","surname":"MyLastName"}'); 
$the_user = new UserModel($user);

我不希望每次我想让用户的名字都必须在课堂上做$this->_userData->name

如果我为名称和姓氏设置默认值,并且像这样创建__get()函数,这样可以吗?

class UserModel {
    private $_userData;
    private $name = 'default';
    private $surname = 'default';
    function __construct($user_data){
          $this->_userData = $user_data;
    }


    function __get($var){
         if(isset($this->_userData->$var))return $this->_userData->$var; // new storage
         if(isset($this->$var))return $this->$var; // old storage
         return null; // the default (could be a throw new Exception() instead)
    }
}

以下是我尝试做的演示:http://codepad.viper-7.com/cuS9Lx

2 个答案:

答案 0 :(得分:3)

我不确定你是否真的想要这样做。就个人而言,如果我有默认值,我会将它们全部放在类级别,然后以这种方式检索它们:

class Foo
{
     static $bar = 1;
     private $_udata;
     public function __get($a)
     {
          return (isset($this->_udata->$a))?
                    $this->_udata->$a:
                    self::$$a; // NOTE DOUBLE $!
     }
};
$f = new Foo(); echo $f->bar; // 1

它占地面积较小,并且具有更多“解析为默认”的感觉。

答案 1 :(得分:0)

(1)延长无聊的答案:

PHP的Json标准函数使用自己的“内部类”“动态”生成对象,因此:

$user = json_decode('{"name":"Neal","surname":"MyLastName"}'); 

将在内部产生如下内容:

//class object(stdClass)#1 (1) {
class tempclass343434 {
    public $name;
    public $surname;
}

$user = new tempclass343434();
$user->name = "Neal";
$user->surname = "MyLastName";

不是你的“UserModel”类。

(2)快速回答:

有一些PHP库允许您使用类进行序列化和反序列化,您可能希望稍微浏览一下Web。对不起,我现在没有链接。

(3)您可能还想制作自己的JSON方法,但它更复杂:

class UserModel {
    // ...

    public $name;
    public $surname;

    // ...

    /* string */ function ExportToJson() { $Result = "";  ... return $Result; }
    /* void */ function ImportToJson(/* String */ JSONValue) { ... }
} // UserModel 

干杯。