【问题标题】:Default Values for Class Variables类变量的默认值
【发布时间】:2011-09-22 02:34:43
【问题描述】:

假设我有一个如下所示的类:

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

【问题讨论】:

  • 我不确定我看到的问题到底是什么?你在做什么没有错,如果它适合你的需要,那就去做吧。请注意,您可能想使用 protected 而不是 private 变量。
  • 注意:在性能方面,知道执行上述各种 isset() 需要多少时间会很有趣。

标签: php class properties default


【解决方案1】:

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

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

它的占用空间更小,并且更具有“解决为默认值”的感觉。

【讨论】:

  • 嗯,因为我们只读取默认值,所以在每个实例中保持静态而不是复制它是有意义的。好点子。
  • 另一方面,设置为静态在视觉上有点反直觉。
  • 好吧,在这种情况下,我可能会有一个“默认用户”,它是用户类的私有静态属性。我可能会使其成为一个简单的数组,以便查找可以是 self::$defaul_user[$var]
【解决方案2】:

(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 库允许您使用您的类进行序列化和反序列化,您可能需要稍微浏览一下网络。抱歉,我现在没有链接。

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

class UserModel {
    // ...

    public $name;
    public $surname;

    // ...

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

干杯。

【讨论】:

  • var_dump(json_decode('{"name":"Chris"}')); 会打印object(stdClass)#1 (1) { ["name"]=> string(5) "Chris" },所以没有自定义类;它是默认的 PHP 类 (stdClass)。这个问题的重点是将这些属性 convertwrapUserModel 类中(例如,通过直接设置属性)。
  • @Neal 不,我说你不知道 O.O.P.我告诉你,那些 JSON+PHP 函数不使用你自己的类,它们使用一个示例生成自己的类。
  • @Christian Sciberras,好的,它的 (stdClass)#1,但它仍然不是“UserModel”。我建议尼尔寻找现有的函数/库(我见过,但没有链接)或自己制作。我们用不同的词说相同的基本概念;-)
猜你喜欢
  • 1970-01-01
  • 2011-08-27
  • 1970-01-01
  • 2014-12-15
  • 1970-01-01
  • 1970-01-01
  • 2012-06-25
  • 2013-01-17
相关资源
最近更新 更多