PHP: замена массива по умолчанию на пользовательский массив? (заменить/объединить)

Я пишу небольшую структуру для себя, чтобы помочь создать свой сайт, мой текущий пример — это объектная функция для запуска HTML-страницы, она будет запускаться следующим образом:

$page->head(array(
    'doctype' => 'html4',
    'description' => 'My page'
    //etc
));

Я хочу иметь массив по умолчанию (как определено в head()), чтобы иметь значения по умолчанию, если они не определены. Это может выглядеть так:

$defaults = array('doctype' => 'html5', 'author' => 'default', ...);

Каким будет лучший способ заменить каждый элемент по умолчанию на один, определенный в аргументах функции head при вызове?

Я нашел что-то вроде этого, не зная, что именно он делает, но имеет правильную идею http://www.php.net/manual/en/function.array-replace.php#94458


person Tim N.    schedule 03.01.2011    source источник


Ответы (2)


Есть ли причина, по которой вы не используете классы для этого? Звучит точно так же, как проблема, которая выиграет от ООП. Например:

class PageHeader
{
    private $m_sDoctype;
    private $m_sDescription;
    // other member vars, such as an array of css files

    function __construct($doctype, $desc)
    {
        // set your default values
        $this->m_sDoctype = _isset($doctype) && $doctype != null ? $doctype : 'html4';
        $this->m_sDescription = _isset($desc) && $desc != null ? $desc : 'My Page';
    }

    function render()
    {
        // dump out html however you see fit
    }
}

class BasePage
{
    private $m_oPageHeader;
    // other member vars

    function __construct($doctype, $desc)
    {
         $m_oPageHeader = new PageHeader($doctype, $desc);
    }

    function render()
    {
        $this->m_oPageHeader->render();
    }
}

index.php (или какая у вас домашняя страница):

var $page = new BasePage(null, 'Home Page');
$page->render();

Пара замечаний:

  1. Это очень упрощенный пример, который я не тестировал.
  2. Я знаю, что это не совсем то, что вы искали (поскольку вы искали решение своей проблемы с массивом), но я разрабатывал для себя небольшой фреймворк, и это определенно то, как я бы сделал это как есть явные преимущества использования ООП в любой среде.

Изменить: я забыл упомянуть, что, используя конструкторы со значениями по умолчанию, вы получаете желаемую функциональность по умолчанию, но также имеете возможность перезаписывать их.

person Demian Brecht    schedule 03.01.2011
comment
Вы правы, моему полу-OO подходу не хватало практической реализации, теперь я буду основывать его на классах и расширяющих классах. Спасибо. - person Tim N.; 03.01.2011

Похоже, вы можете сделать это с помощью array_merge, например:

$page->head(array_merge($defaults,array(
  'doctype' => 'html4',
  'description' => 'My Page'
  // etc
)));

Это перезапишет любое значение из $defaults новым значением, сохраняя при этом любой ключ, который не имеет нового значения.

person futureal    schedule 03.01.2011
comment
Спасибо за ответ на исходный вопрос, я больше понимаю в этом. - person Tim N.; 03.01.2011