Как написать конструктор, который будет инициализировать поля класса без жесткого кодирования имен полей - PullRequest
2 голосов
/ 10 апреля 2011

Как улучшить мою попытку:

class gotClass {
    protected $alpha;
    protected $beta;
    protected $gamma;
    (...)

    function __construct($arg1, $arg2, $arg3, $arg4) {
        $this->alpha = $arg1;
        $this->beta = $arg2;
        $this->gamma = $arg3;
        (...)
    }
}

на что-нибудь красивое и компактное (отредактировано в ответ на комментарии)

class gotClass {
        protected $alpha;
        protected $beta;
        protected $gamma;
        (...)

    function __construct($alpha, $beta, $gamma) {
        $functionArguments = func_get_args();
        $className = get_called_class();
        $classAttributes = get_class_vars($className);
        foreach ($functionArguments as $arg => $value)
            if (array_key_exists($arg, $classAttributes))
                $this->$arg = $value;
}

Я не могу заставить его работать, я не знаю, какие функции использовать. Я упоминал, что я новичок в PHP? Ваша помощь очень ценится.

РЕДАКТИРОВАТЬ: Имена полей не соответствуют ни одному шаблону, как, возможно, предложили неотредактированный пост. Поэтому их имена не могут быть построены в некотором поле [i] -подобном цикле. Приношу свои извинения за неясность.

Ответы [ 2 ]

2 голосов
/ 10 апреля 2011

Редактировать после комментариев : отсутствие поддержки PHP для именованных аргументов (что решило бы эту проблему в целом) - вещь, о которой много говорят. По моему опыту, до тех пор, пока нет собственного решения проблемы, действительно лучше объявить каждый параметр отдельно для целей автоматической генерации документа и функции поиска в вашей IDE. Среда IDE может отображать ожидаемые параметры, только если они явно объявлены.

См. этот SO вопрос , чтобы найти другой популярный способ решения этой проблемы.

Если вам нужен , чтобы сделать это в любом случае, вам нужно func_get_args(), чтобы получить все аргументы, переданные конструктору, и массив для сопоставления имен свойств.

Что-то вроде

private $fields = array("alpha", "beta", "gamma");

function __construct()
 { 
   $args = func_get_args();
   foreach ($args as $index => $arg)
    { $this->{($this->fields[index])} = $arg; }
 }

это не делает никаких проверок, существует ли указанная переменная - возможно, добавьте некоторые подробности о том, какие именно проверки вам нужны.

0 голосов
/ 10 апреля 2011

У вас есть синтаксическая ошибка, это

foreach ($args as $arg -> $value)

Должно быть

foreach ($args as $arg => $value)

В первом примере вам нужно будет позвонить

new gotClass($a, $b, $c)

Но во втором примере вы ожидаете один массив в качестве параметра, поэтому вам нужно будет сделать

new gotClass(array($a, $b, $c))

Вы можете использовать рефакторинг и использовать func_get_args(), при использовании этого будет работать следующий формат

new gotClass($a, $b, $c) 

function __construct() {
    $className = get_called_class();
    $classAttributes = get_class_vars($className);
    foreach (func_get_args() as $arg -> $value)
        if (array_key_exists($arg, $classAttributes))
            $this->$arg = $value;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...