2011-06-23 5 views
1

У меня есть этот код.Как использовать переменные в аргументе функции PHP?

function outputCalendarByDateRange($client, $startDate="2011-06-22", 
           $endDate='2011-06-26') 

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

$startDate=date("Y-m-D") 
$endDate=strtotime(date("Y-m-d", strtotime($todayDate)) . " +3 days"); 

и

$date1=date("Y-m-D") 
$date2=strtotime(date("Y-m-d", strtotime($todayDate)) . " +3 days"); 
    function outputCalendarByDateRange($client, $startDate=$date1, 
           $endDate=$date2) 

ни один из них не работает. Как мне заставить работать?

Спасибо!

+0

Ваш первый '$ endDate' сильно преувеличен. Простой '$ endDate = date ('Y-m-D', strtotime ('+ 3 дня')) будет делать. –

+0

@Marc B: На самом деле, вы столкнулись с проблемами около полуночи каждый день, делая это таким образом - лучше отложить его от $ startDate: '$ endDate = date ('Ym-d', strtotime ($ startDate. ' +3 дня »))' для обработки изменений даты во время выполнения двух операторов. Он по-прежнему будет отключен в день к тому времени, когда сценарий попадет в третью строку кода, но по крайней мере две даты будут отключены равномерно ... –

+0

@Эт: в этом случае было бы лучше хранить сырые значение времени на сегодняшний день, а не roundtripping все через strtotime дополнительных времен. Это волшебная функция, но она НЕ эффективна. –

ответ

4

вы не можете использовать оператор в объявлении функции, но вы можете установить значение нулевого значение и проверить его во время выполнения:

function foo($bar = null) 
{ 
    if (is_null($bar)) 
    { 
    $bar = 'baz'; 
    } 
    ...code... 
} 
+0

также, 'empty' может использоваться для проверки в некоторых случаях, когда' array() ',' "", 'null',' false' и т. Д. Должны запускать значение по умолчанию. – zzzzBov

0

Вы не можете иметь переменный аргумент по умолчанию значения, вы «придется решить эту проблему в коде:

function outputCalendarByDateRange($client, $startDate = null, $endDate = null) { 
    $startDate = $startDate ? $startDate : date('Y-m-d'); 
    $endDate = $endDate ? $endDate : date('Y-m-d', strtotime('+3 days')); 

    ... 
} 

Вызов этой функции без второго и третьего аргумента будет использовать текущую дату/текущую дату +3, назвав его с аргументами вы можете указать свои собственные значения.

3

Вы не можете иметь выражения в объявлении функции. Но константы могут быть обходным путем для того, что вы хотите сделать.

define("FUNC_CAL_DATE1", date("Y-m-D")); 
define("FUNC_CAL_DATE2", strtotime(date("Y-m-d",strtotime($to... 

function outputCalendarByDateRange($client, 
      $startDate=FUNC_CAL_DATE1, $endDate=FUNC_CAL_DATE2) { 

Они на самом деле выражения тоже, но специально обработаны в этом контексте и работы, где =$date1 не будет.

+0

Хорошее обходное решение - не подумал об этом. +1 –

+0

Мне любопытно, могут ли быть проблемы из-за кэширования. – zzzzBov

1

Вы не можете передавать переменные в качестве значений по умолчанию. Смотрите ниже возможного решения, что вы пытаетесь достичь:

<?php 
    error_reporting(E_ALL); 

    $defaultStartDate = date("Y-m-d"); 
    $defaultEndDate = date("Y-m-d", strtotime($defaultStartDate . " + 3 days")); 

    function outputCalendarByDateRange($client, $startDate="", $endDate="") { 
     global $defaultStartDate, $defaultEndDate; 

     if ($startDate === "") { 
      $startDate = $defaultStartDate; 
     } 
     if ($endDate === "") { 
      $endDate = $defaultEndDate; 
     } 
     echo "Client: " . $client . "<br />"; 
     echo "Start Date: " . $startDate . "<br />"; 
     echo "End Date: " . $endDate . "<br />"; 
    } 

    outputCalendarByDateRange("Test Client"); 

    echo "<br />"; 

    outputCalendarByDateRange("Test Client #2", date("Y-m-d", strtotime("2011-06-01")), date("Y-m-d", strtotime("2011-07-01"))); 

?> 

Выход:

Client: Test Client 
Start Date: 2011-06-23 
End Date: 2011-06-26 

Client: Test Client #2 
Start Date: 2011-06-01 
End Date: 2011-07-01 
-1

Я собираюсь сделать предположение и сказать, что вы пытаетесь установить $ date1 равным к переменной в функции. Это не обязательно, просто перечислите их по порядку. function outputCalendarByDateRange($client, $date1, $date2)

Смежные вопросы