Различать параметр, который может принимать содержимое файла или путь к файлу в PHP - PullRequest
2 голосов
/ 22 июня 2010

Я реализую функцию под названием attach. Я ищу способ получить параметр, который является либо путем к файлу, либо содержимым файла. Вот что у меня есть:

/**
 *  @param name - name of the file
 *  @param file - either a file or a file path
 */
function attach($name, $file) {
    $attachment = array();

    $attachment['name'] = $name;

    if(map($file)) {
        $attachment['filepath'] = $file;
        $attachment['file'] = file_get_contents($file);
    } else {
        $attachment['file'] = $file;
        $attachment['filepath'] = getcwd();
    }
}

/**
 * @param filepath - can take multiple forms
 *   ie. ui:form:text.css => ui/form/text.css
 *       text.css => getcwd().'text.css'
 *       /ui/form/text.css => /ui/form/text.css
 * 
 * @return if file exists - return file path
 *         if not found - return false
*/

function map($filepath) {
   // ... too long to post
}

Функция map позволяет вам превращать пространства имен (используя «:») в filepaths.

Проблема, о которой я беспокоюсь, заключается в том, что в пути к файлу была допущена ошибка (т. Е. Кто-то неправильно указал путь к файлу). это должно быть содержимое файла

Также: если возможно, я бы не стал редактировать map(), так как это потребовало бы от меня изменения набора кода - рассматривайте карту как черный ящик.

Наконец: я быстро собрал этот пример - поэтому, пожалуйста, не обсуждайте недостатки getcwd() и другие синтаксические проблемы. У меня есть более сложная система в map()

Спасибо! Мэтт Мюллер

Ответы [ 2 ]

2 голосов
/ 22 июня 2010

Даже если бы в PHP была лучшая поддержка перегрузки методов, вам было бы здесь непросто, поскольку обе переменные (путь к файлу и содержимое файла), вероятно, были бы строкой.Что мешает вам просто создать пару методов-оболочек, таких как attach_filepath (..), attach_filecontents (..)?Или, если вы настроены на использование одного метода, вы можете добавить третий параметр, например:

function attach($name, $file, $filecontents=false) {

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

0 голосов
/ 22 июня 2010

Перед добавлением вложения ваш код может использовать функцию, подобную file_exists, чтобы определить, является ли путь на самом деле путем, и файл действительно существует.Кроме того, вы можете проверить, относится ли путь к папке или файлу.

...