PHP: передача неустановленных аргументов без дублирования значений по умолчанию

class BetterDOMDocument extends DOMDocument 
{
    function __construct($version = null, $encoding = null) {
        parent::__construct($version, $encoding);
    }
}

Этот код создаст заголовок XML с пустым атрибутом версии.

Однако я не могу просто определить конструктор как:

function __construct($version, $encoding) {}

Потому что теперь PHP жалуется на использование неопределенной переменной, если я хочу использовать этот конструктор без передачи каких-либо аргументов.

DOMDocument не требует передачи $version, он будет использовать значение по умолчанию, если я не передам значение. Как я могу переопределить конструктор, сохранив неизменной обработку аргументов базового класса, не дублируя определенные значения по умолчанию?

Меня это интересует не с точки зрения проблемы, с которой я застрял и которая требует обходного пути, а с точки зрения дизайна языка PHP. Можно ли и как воспроизвести поведение DOMDocument в PHP, или есть что-то особенное в том, как внутренний код может работать с неопределенными значениями?


person miracle2k    schedule 12.03.2012    source источник
comment
Ваш конструктор класса имеет те же аргументы, что и базовый класс. Какова ваша точная проблема? Можете ли вы опубликовать фрагмент кода, который воспроизводит проблему?   -  person Álvaro González    schedule 12.03.2012
comment
Я обновил вопрос с некоторыми разъяснениями.   -  person miracle2k    schedule 14.03.2012


Ответы (1)


Просто установите некоторые разумные значения по умолчанию:

class BetterDOMDocument extends DOMDocument 
{
    function __construct($version = '1.0', $encoding = 'UTF-8') {
        parent::__construct($version, $encoding);
    }
}

Если на самом деле это все, что вы делаете в конструкторе, вам не нужно его перегружать в первую очередь, если только цель не задана вашими собственными значениями по умолчанию.

В PHP и, как я подозреваю, в других языках вы на самом деле не можете указать функции «использовать значение по умолчанию», если только передача NULL в качестве аргумента (например) не обрабатывается классом таким образом, что вместо этого он будет использовать значение по умолчанию. . Вам придется работать с дизайном существующего класса/функции, который может отличаться.

person Wesley Murch    schedule 12.03.2012
comment
На самом деле, DOMDocument не требует передачи $version, он будет использовать значение по умолчанию, если я не передам значение. Вопрос в том, как я могу воспроизвести поведение, не дублируя фактическое значение по умолчанию. Я обновил вопрос, чтобы сделать это более ясным. - person miracle2k; 14.03.2012
comment
Что касается вашего редактирования: моя ошибка, я неправильно прочитал документы. На самом деле вы не можете сказать функции использовать значение по умолчанию, если только передача NULL в качестве аргумента (например) не обрабатывается классом таким образом, что вместо этого он будет использовать значение по умолчанию. Например: stackoverflow.com/questions /9541776/ - person Wesley Murch; 14.03.2012
comment
См. также: php.net/manual/en/functions.arguments.php могут быть обходные пути с такими вещами, как func_get_args() для некоторых экземпляров, но на самом деле это следует рассматривать в каждом конкретном случае. Буквальная вещь, о которой вы просите, не может быть выполнена. - person Wesley Murch; 14.03.2012