Como usar PHP date() para converter de AAAA-MM-AA para “01 de janeiro de 2011” em uma função

StackOverflow https://stackoverflow.com//questions/9618964

Pergunta

Consigo converter a data (05/01/2011 a 05 de janeiro de 2011) usando:

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

No entanto, gostaria de implementar isso em uma função para poder usá-la em diferentes lugares:

<?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);

?>

A função está dentro de um loop while (WordPress). A primeira data está sendo formatada corretamente, mas no segundo recebo a seguinte mensagem de erro:

Erro fatal:Não é possível redeclarar newDate() (declarado anteriormente em ..

Como eu faria isso funcionar e por que isso está acontecendo? Obrigado.

Foi útil?

Solução

Você colocou a própria definição da função dentro de um loop.Por exemplo:

while ($someCondition) {

  function newDate () {

    // Function code

  }

  // Loop code

}

Isso tenta redeclarar a função em cada iteração do loop, o que resultará no erro que você verá.

Envolva a definição da função em um if:

while ($someCondition) {

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

      // Function code

    }
  }

  // Loop code

}

Ou (melhor) declare a função antes do loop:

function newDate () { 

  // Function code

}

while ($someCondition) {

  // Loop code

}

EDITAR Seguindo seu comentário abaixo, aqui está como esse código poderia ser reescrito para usar o DateTime objeto:

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);

Esta função aceita uma string em qualquer formato de data que possa ser analisada pelo DateTime objeto como seu primeiro argumento (acho que usa o mesmo mecanismo interno que strtotime()).O segundo argumento opcional é uma string de formato idêntica ao primeiro argumento para o date() função - se for omitido, o padrão d F Y será usado.

Em relação às suas perguntas sobre OOP:

Is this approach better? - Isso é uma questão de opinião.Vejo comentado aqui que o DateTime objeto é melhor que o strtotime()/date() abordagem e vice-versa, mas na verdade o que isso significa é que você deve usar a abordagem que você entende melhor, aquela que faz mais sentido para uma determinada situação e aquela que torna seu código mais legível para você e outros desenvolvedores que você pode estar trabalhando.Nunca vi um argumento convincente para que um fosse definitivamente melhor que o outro.Para a rotina acima, não creio que faça muita diferença.

How could I rewrite my function in that format? - Veja acima.

Is DateTime the object and format the method to change a property? - DateTime é o nome de um aula.No código de exemplo acima, o $date variável é um objeto, que é um instância do DateTime aula.E sim, format é o nome de um método.

Would this help me understand OO better if I will try and write all the code in this approach, where possible? - OOP requer uma maneira de pensar diferente da escrita de código processual, e não é algo trivial de aprender.Existem muitos, muitos recursos disponíveis para ajudá-lo a se familiarizar com OOP, então não vou entrar nisso aqui, Google seria o lugar para começar.A única coisa que direi é que se você quiser entender OOP, PHP não é o lugar para começar.PHP é não uma linguagem OO, é uma linguagem de script que fornece suporte OO.Eu apontaria a direção de Java para aprender como pensar em OO, embora outros possam e irão discordar.

Outras dicas

Você deve declarar a função antes do loop.Você declara uma função chamada NewDate primeiro e depois a usa em qualquer lugar a qualquer momento, mas não pode declarar uma função com o mesmo nome novamente (e é exatcly o que acontece quando você escreve function newDate(..){....} dentro de um loop.

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
}

É a função declarado dentro do loop while?Nesse caso, ela será declarada uma vez para cada iteração do loop e, como uma função só pode ser declarada uma vez, isso levará ao erro que você descreve.

Se for esse o caso, você pode simplesmente declarar a função fora do loop (talvez em um arquivo diferente com outras funções auxiliares) e chamá-la de dentro do loop sem problemas.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top