Как использовать PHP date () для преобразования из YYYY-MM-YY в «01 января 2011» в функции - PullRequest
1 голос
/ 08 марта 2012

Я могу преобразовать дату (2011-01-05 по 05 января 2011), используя:

<?php   
$whatever = get_post_meta($post->ID, start_date, true);
$nice_date = date("d F Y", strtotime($whatever));
echo $nice_date;
?>

Однако я хотел бы реализовать это в функции, чтобы использовать ее в разныхмест:

<?php   

function newDate($whatever) {
$nice_date = date("d F Y", strtotime($whatever));
return $nice_date; }

$crap_date = get_post_meta($post->ID, start_date, true);
echo newDate($crap_date);

?>

Функция находится внутри цикла while (WordPress). Первая дата корректно форматируется , но на второй я получаю следующее сообщение об ошибке:

Неустранимая ошибка: невозможно повторно объявить newDate () (ранее объявлено в ..

Как мне сделать эту работу и почему это происходит? Спасибо.

Ответы [ 3 ]

2 голосов
/ 08 марта 2012

Является ли функция объявленной внутри цикла while?Если это так, он будет объявлен один раз для каждой итерации цикла, и поскольку функция может быть объявлена ​​только один раз, это приведет к описанной вами ошибке.

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

2 голосов
/ 08 марта 2012

Вы поместили само определение функции в цикл. Например:

while ($someCondition) {

  function newDate () {

    // Function code

  }

  // Loop code

}

Это пытается переопределить функцию на каждой итерации цикла, что приведет к ошибке, которую вы видите.

Либо оберните определение функции в if:

while ($someCondition) {

  if (!function_exists('newDate')) {
    function newDate () { 

      // Function code

    }
  }

  // Loop code

}

Или (лучше) объявить функцию перед циклом:

function newDate () { 

  // Function code

}

while ($someCondition) {

  // Loop code

}

РЕДАКТИРОВАТЬ Исходя из вашего комментария ниже, вот как этот код может быть переписан для использования объекта DateTime:

function format_date ($dateStr, $formatStr = 'd F Y') {
  $date = new DateTime($dateStr);
  return $date->format($formatStr);
}

$crap_date = get_post_meta($post->ID, 'start_date', true);
echo format_date($crap_date);

Эта функция принимает строку в любом формате даты, которая может быть проанализирована объектом DateTime в качестве первого аргумента (я думаю, что используется тот же внутренний механизм, что и strtotime()). Необязательный второй аргумент - это строка формата, идентичная первому аргументу для функции date() - если это не указано, будет использоваться значение по умолчанию d F Y.

По вопросам ООП:

Is this approach better? - Это очень вопрос мнения. Я вижу здесь прокомментированное, что объект DateTime лучше, чем подход strtotime() / date() и наоборот, но на самом деле все сводится к тому, что вы должны использовать подход, который вы понимаете лучше всего, тот, который делает больше всего подходит для данной ситуации, и тот, который делает ваш код наиболее читабельным для вас и других разработчиков, с которыми вы можете работать. Я никогда не видел убедительных аргументов в пользу того, что один из них определенно лучше другого. Для приведенной выше процедуры я не думаю, что это имеет большое значение.

How could I rewrite my function in that format? - см. Выше.

Is DateTime the object and format the method to change a property? - DateTime - это имя класса . В приведенном выше примере кода переменная $date представляет собой объект , который является экземпляром класса DateTime . И да, format - это имя метода .

Would this help me understand OO better if I will try and write all the code in this approach, where possible? - ООП требует иного мышления, чем написание процедурного кода, и это не тривиальная вещь. Есть много, много ресурсов, чтобы помочь вам разобраться с ООП, поэтому я не буду вдаваться в подробности здесь, Google было бы началом. Я скажу лишь одно: если вы хотите понять ООП, PHP не место для начала. PHP является не языком OO, это язык сценариев, который обеспечивает поддержку OO. Я бы указал вам, как научиться думать в ОО в направлении Java, хотя другие могут и не согласятся.

2 голосов
/ 08 марта 2012

Вы должны объявить функцию перед циклом. Сначала вы объявляете функцию с именем newDate, а затем используете ее где угодно, но вы не можете объявить функцию с тем же именем снова (и это именно то, что происходит, когда вы пишете function newDate(..){....} внутри цикла.

function newDate($whatever) {
$nice_date = date("d F Y", strtotime($whatever));
return $nice_date; }

$crap_date = get_post_meta($post->ID, start_date, true);
echo newDate($crap_date);

//Here goes the loop
while( $i < 100)
{
  //do something with the newDate function
}
...