是否可以在PHP函数内使用变量而不传递它?

时间:2014-01-31 08:06:46

标签: php function variables

所以我正在创建自己的个人日历Web应用程序,而且我遇到了函数中变量的问题。目前,我的应用程序开始抽出时间,找出今天的日期,日期和年份。

$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;    
}

现在我可以传递所有三个变量($ month,$ input,$ year),因为我在while循环中使用了该函数。但我之前在其他项目中遇到过这个问题。我有一个让我的生活更轻松的功能,但每次使用该功能时我都要传递六个变量,即使它们中的一些很少改变。

4 个答案:

答案 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

(更好地命名您的课程,您可能希望根据需要更改数据成员的可见性)

答案 1 :(得分:0)

如果您创建一个包含您用来传递的所有数据的类,那么您将获得一些好处:

  • 您没有很长的参数列表来处理
  • 参数列表可能会更改,您只需更改该类,而无需更改函数签名
  • 您拥有所有相关数据
class MyDate {
  public $year,$month, $day;
}


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

更新:

正如您可以在评论中看到的那样,使用DateTime类已经足够了,但我的理解是,您在项目的不同时刻遇到了这个问题,所以这是一个很好的通用方法,所以你可以解决所有这些情况。

答案 2 :(得分:0)

Globals会做到这一点,但通常很好远离。在较大的程序中,您无法确定是否存在行为,因为它们可以在整个程序中的任何位置进行更改。使用全局变量的测试代码变得非常困难。

另一种方法是使用一个类。

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

答案 3 :(得分:-3)

您可以使用&来确定变量。 这样的事情:

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

使用时要小心。如果您打算在此函数中更改此变量的值,请记住,您将直接在内存中更改其值。