Значения по умолчанию для переменных класса - PullRequest
5 голосов
/ 24 июня 2011

Допустим, у меня есть класс, который выглядит так:

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 ]

3 голосов
/ 24 июня 2011

Я не уверен, что именно так вы и хотели бы это сделать.Лично, если бы у меня были значения по умолчанию, я бы поместил их все на уровень класса, а затем извлек их таким образом:

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

У него меньше занимаемая площадь, и у него больше ощущение "Разрешить по умолчанию".

0 голосов
/ 24 июня 2011

(1) Расширенный скучный ответ:

Стандартные функции Json для PHP генерируют объекты «на лету» со своими собственными «внутренними классами», поэтому:

$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 

Приветствие.

...