1

次を使用して日付(2011-01-05から2011年1月5日)を変換できます。

<?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)内にあります。最初の日付は正しくフォーマットされていますが、2番目の日付には次のエラーメッセージが表示されます。

致命的なエラー:newDate()を再宣言できません(以前はで宣言されていました。。

どうすればこれを機能させることができますか?また、なぜそれが起こっているのですか?ありがとう。

4

3 に答える 3

2

ループの前に関数を宣言する必要があります。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
}
于 2012-03-08T14:16:52.843 に答える
2

関数はwhileループ内で宣言されていますか?その場合、ループの反復ごとに1回宣言されます。また、関数は1回しか宣言できないため、説明したエラーが発生します。

この場合、ループの外側で関数を宣言し(おそらく、他のヘルパー関数とは別のファイルで)、ループの内側から問題なく呼び出すことができます。

于 2012-03-08T14:18:55.570 に答える
2

関数定義自体をループ内に配置しました。例えば:

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())。オプションの2番目の引数は、date()関数の最初の引数と同じフォーマット文字列です。これを省略すると、デフォルトd F Yが使用されます。

OOPの質問について:

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?--OOPには、手続き型コードを作成するのとは異なる考え方が必要であり、それを理解するのは簡単なことではありません。OOPを理解するのに役立つリソースはたくさんあるので、ここでは説明しません。Googleが出発点になります。私が言うことの1つは、OOPを理解したいのであれば、PHPは出発点ではないということです。PHPはオブジェクト指向言語ではなく、オブジェクト指向サポートを提供するスクリプト言語です。OOでの考え方を学ぶために、Javaの方向性を示しますが、他の人は反対する可能性があります。

于 2012-03-08T14:19:02.313 に答える