2014-01-31 3 views
0

Итак, я создаю свое собственное веб-приложение для календаря, и у меня возникает проблема с переменными внутри функции. В настоящее время мое приложение начинается с того, что тянет время и узнает месяц, день и год сегодняшней даты.Можно ли использовать переменную внутри функции PHP, не передавая ее?

$year = date("Y",time()); 
$today = date("j",time()); 
$month = date("m",time()); 

Позже в приложении у меня есть функция «нарисовать» каждый квадрат календаря.

function thisDay($input) { 
    date("m",mktime(0,0,0,$month,$input,$year)); 
    echo //html stuff here;  
} 

Теперь я могу передать все три переменные ($ в месяц, $ ввода, $ в год), потому что я использую эту функцию в цикле. Но я сталкивался с этим раньше в других проектах, над которыми я работал. У меня есть функция, облегчающая мою жизнь, но мне приходится передавать полдюжины переменных каждый раз, когда я использую эту функцию, хотя некоторые из них редко меняются.

+0

Возможно, вы можете использовать класс Bean (класс с геттерами и сеттерами) и назначить все значения там и передать только объект. –

+1

Тогда, возможно, вы ищете классы и объекты! – deceze

+0

Вы можете объявить переменные как «глобальные» внутри функции, но это очень грязный способ сделать что-то. Передача переменных может показаться болью, но ясно, откуда возникают переменные. –

ответ

0

Если вы создаете класс со всеми данными, которые вы используете для передачи, у вас есть несколько преимуществ:

  • Вы не имеете длинный список параметров для обработки
  • Список параметров может измениться, вы просто изменить этот класс, и вам не нужно изменять функции подписи
  • У вас есть все связанные данные вместе
class MyDate { 
    public $year,$month, $day; 
} 


function anyFunction(MyDate $date) { 
    //here you can use $date->day, $date->month, or $date->year 
} 

UPDATE:

Как вы можете прочитать I n комментариев, используя класс DateTime, уже было бы достаточно, но я понимаю, что у вас есть эта проблема в разные моменты в ваших проектах, поэтому это хороший общий подход, чтобы вы могли решить все эти ситуации.

+0

@cerbrus, это отличный трюк с комментарием! –

+0

Спасибо;) Эти списки могут быть немного ошибочными, когда вам нужен блок кода после него. – Cerbrus

+0

Да, я редактировал его «здесь код», но ваш путь лучше! –

0

Конечно, вы могли бы обойти необходимость передавать переменные в вашей функции с помощью глобалам, но это намного хуже ситуация, чтобы быть в.

Вместо определить класс, который представляет ваши данные и передавать экземпляры, которые класс.

Что-то вроде:

class My_Date { 
    public $year; 
    public $today; 
    public $month; 

    // ...any methods you need 
} 

Затем вы можете создать экземпляр этого класса, и просто передать этот экземпляр:

$my_date = new My_Date(); 
$my_date->year = date("Y",time()); 
$my_date->today = .... // and so on. 

// then call your function: 
my_function($my_date); // just pass the single argument 

(Назовите ваш класс лучше, и вы можете захотеть изменить видимость данных в зависимости от ваших потребностей)

+0

Не используйте глобалы для такого дизайна. Это неверно**. –

+0

@BartFriederichs: Где я использую глобальные переменные? – xbonez

+0

Вы начинаете с высказывания «вы могли бы ... использовать глобальные переменные». –

0

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

Альтернативой является использование класса.

class Test { 
     private $year = date("Y",time()); 
     private $today = date("j",time()); 
     private $month = date("m",time()); 

     public function thisDay() { 
      //do your stuff 
     } 
    } 

    $obj = new Test(); 
    $newvalue = $obj->thisDay(); 
+0

Это не работает, но на лучшем треке. – deceze

-3

Вы можете Хороший доступ к переменным с помощью &. Нечто подобное:

function thisDay($input) { 
date("m",mktime(0,0,0,&$month,$input,&$year)); 
echo /*html stuff here*/; } 

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

+1

Эх, нет, это не так [ссылки на ценности работают] (http://www.php.net/manual/en/language.references.pass.php). – Cerbrus

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