Предопределенные интерфейсы PHP и SPL - проверка версии достаточна? - PullRequest
2 голосов
/ 05 апреля 2011

Возможно, это очевидный вопрос, но я хочу быть уверенным.

Я пытаюсь выяснить, в какой версии " Предопределенные интерфейсы " появились в PHP.Я предполагаю, что 5.0.0, так как это когда интерфейсы SPL были добавлены в соответствии с документами.

Кроме того, могут ли они когда-либо быть отключены с помощью конфигурации или перекомпиляции, или можно безопасно предположить, что проверка версии удовлетворяет их присутствию?Почему они даже отделены от SPL, отличается ли это от того, что их нельзя отключить, а SPL можно отключить?(хотя бы до 5.3.0)

Ответы [ 3 ]

1 голос
/ 05 апреля 2011

Вы можете узнать, с какой версии доступен каждый интерфейс SPL здесь . Некоторые были добавлены после 5.0. И согласно инструкция с PHP 5.3.0 SPL не может быть отключена.

1 голос
/ 07 апреля 2011

В настоящее время руководство отображает информацию о версии только для методов, принадлежащих каждому интерфейсу.Эту информацию о версии можно найти в верхней части страницы над прототипом метода ( info ).

Итак, перейдите к описанию (ям) метода и посмотрите, что там указано.

Можно ли их когда-либо отключить с помощью конфигурации или перекомпиляции, или можно смело предполагать версиючек удовлетворяет их наличие?Почему они даже отделены от SPL, отличается ли это от того, что их нельзя отключить, а SPL можно отключить?(по крайней мере до 5.3.0)

Эти интерфейсы вообще не являются частью расширения SPL, и их включение или отключение отсутствует.Они должны были быть реализованы в движке Zend;было бы невозможно сделать то, что они делают в расширении, которым является SPL.


Для чего это я открыл запрос на функцию ( # 49927 ) aнекоторое время назад о предоставлении информации о версии на страницах обзора / краткого обзора класса (и, следовательно, также интерфейса).Спасибо за напоминание, что оно существует и будет полезно!

1 голос
/ 05 апреля 2011

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

Однако, существует пуленепробиваемый способ проверить их существование, вместо того, чтобы полагаться на проверку версии: interface_exists. Для версий PHP 5.0.0 и 5.0.1 вместо этого вам нужно будет сделать class_exists.

Итак:

function interfaces_defined() {
    // Most likely case first
    if (version_compare(PHP_VERSION, '5.3.0', '>=')) {
        return true;
    }
    else if (version_compare(PHP_VERSION, '5.0.0', '<')) {
        return false;
    }
    else if (version_compare(PHP_VERSION, '5.0.1', '<=')) {
        return class_exists('Iterator');
    }
    else {
        return interface_exists('Iterator');
    }
}

Не самая красивая, но она определенно охватывает все основы.

...