2016-06-29 5 views
2

Там же функция экстракта для создания локальных переменных из массива:экстракт() для членов класса

extract(['a' => 10, 'b' => 20]) // $a = 10, $b = 20 

Что бы чистое решение, как функции extract(), но и для членов класса? Очевидно, я могу что-то сделать в соответствии с:

class User { 
    private $user_id; 
    private $password; 
    private $email; 

    public function __construct($params) { 
    $this->user_id = isset($params['user_id']) ? $params['user_id'] : null; 
    $this->password = isset($params['password']) ? $params['password'] : null; 
    $this->email = isset($params['email']) ? $params['email'] : null; 
    } 
} 

Есть ли более чистый способ сделать это?

ответ

5

Простое решение, которое ведет себя как extract():

foreach($params as $key => $val) { 
    $this->$key = $val; 
} 
1

Чистейшая способ сделать это, чтобы избежать массивов и extract() вообще и передать конструктору отдельные аргументы:

public function __construct($user_id, $password, $email) 
{ 
    // Add validation and default values for each member as needed 
    $this->user_id = $user_id; 
    $this->password = $password; 
    $this->email = $email; 
} 

Таким образом, еще программист , который читает код, с самого начала понимает, какие аргументы ожидает конструктор и каково их значение.

Он также делает код, который использует класс более понятным. Сравните:

$user = new User($id, $_POST['password'], $_POST['email']); 

с:

$user = new User($_POST); 

В первом случае вы не должны прочитать код класса User, чтобы понять, почему он не может или производит неожиданные результаты. Быстрый просмотр по содержимому $_POST достаточно, чтобы узнать, соответствуют ли значения, переданные User::__construct().


«Другой программист» может (и в большинстве случаев будет) ты, несколько месяцев спустя.

Смежные вопросы