كيفية استخدام PHP date() للتحويل من YYYY-MM-YY إلى "01 يناير 2011" في إحدى الوظائف

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

سؤال

أنا قادر على تحويل التاريخ (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() (تم الإعلان عنه مسبقًا في..

كيف يمكنني أن أجعل هذا العمل ولماذا يحدث ذلك؟ شكرًا.

هل كانت مفيدة؟

المحلول

لقد قمت بوضع تعريف الدالة نفسه داخل حلقة.على سبيل المثال:

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 سوف يستخدم.

فيما يتعلق بأسئلتك 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، لذا لن أخوض في الأمر هنا، جوجل سيكون المكان المناسب للبدء.الشيء الوحيد الذي سأقوله هو أنه إذا كنت تريد فهم OOP، فإن PHP ليس المكان المناسب للبدء.PHP هو لا لغة OO، هي لغة برمجة توفر دعم OO.أود أن أشير إليك في اتجاه Java لتعلم كيفية التفكير في OO، على الرغم من أن الآخرين قد يختلفون مع ذلك.

نصائح أخرى

يجب أن تعلن الدالة قبل الحلقة.تعلن وظيفة تسمى 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
}

هي الوظيفة أعلن داخل الحلقة بينما؟إذا كان الأمر كذلك، فسيتم الإعلان عنها مرة واحدة لكل تكرار حلقة، وبما أنه لا يمكن الإعلان عن الدالة إلا مرة واحدة، فسيؤدي ذلك إلى الخطأ الذي تصفه.

إذا كانت هذه هي الحالة، يمكنك ببساطة إعلان الوظيفة خارج الحلقة (ربما في ملف مختلف مع وظائف مساعدة أخرى) واستدعائها من داخل الحلقة دون أي مشاكل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top