我可以在PHP中的不同函数之间共享变量吗?

Can I share variables between different functions in PHP?

提问人:aborted 提问时间:10/10/2010 最后编辑:Galenaborted 更新时间:4/4/2017 访问量:33461

问:

我会试着用一个例子来解释......

假设我有两个不同的函数,其中一个有一个定义的变量。在第二个函数中,我不想再次编写相同的变量,我可以在第二个函数中简单地使用第一个函数中的变量而不在第二个函数中重新定义它吗?

像这样:

function a()
{
  $var = "my variable";
}

function b()
{
 echo $var;
}

对不起,如果这个问题有点傻,但我仍然是一个初学者=)。

PHP 变量 函数

评论

0赞 Peter Ajtai 10/10/2010
一行前的 4 个空格格式为代码。 供选择。ctr-k
2赞 user359996 10/10/2010
@Peter Ajtai(但真的很@user445820):还可以突出显示(选择)代码,然后单击带有所有 0 和 1 的按钮。
1赞 user359996 10/10/2010
+1 明确说明,有效的初学者问题。感谢您提供说明性代码示例。
0赞 outis 2/13/2012
Access 变量可能与另一个函数的范围重复?

答:

8赞 fredley 10/10/2010 #1
$a = 1;
function a(){
  global $a;
  $a = 2;
  }
function b(){
  global $a;
  echo $a;
  }

a();
b();

输出:

2

评论

1赞 user359996 10/10/2010
如果提问者还不了解全局变量,他们显然是一个极端的新手。一些解释性文字将具有指导意义。
1赞 Andy Lester 10/10/2010
这是一种方法,但它为您提供了全局变量。全局变量是可维护软件的祸根,所有程序员,尤其是PHP程序员,最好不要使用它们。
0赞 aborted 10/10/2010
如果函数的位置不同,让我们想象一下函数 b() 是第一个,然后是函数 a(),这个仍然适用吗?
11赞 Peter Ajtai 10/10/2010 #2

当然你可以做全局,但PHP 5.3.0+有匿名函数,所以你也可以做闭包:

<?php

function a(){
  $a = 1;  
  echo "First: $a, ";
  ++$a;

    // This is a closure. It can gain access to the variables of a() with the 
    // use option.
  $b = function() use ($a) {
      echo "second: $a";  
  };  
  $b();
};
a(); // Outputs: First: 1, second: 2
?>

在此 Codepad 示例中试用


或者可能更有用:

<?php

function a(){
  $a = 1;  
  echo "First: $a, ";
  ++$a;
  $b = function() use ($a) {
      echo "second: $a";  
  };        
  return $b;
};
$fun = a();     // $fun is now $b & $b has access to $a!
$fun();
// Outputs: First: 1, second: 2
?>

在此 Codepad 示例中试用

从文档中:

闭包还可以从父作用域继承变量。任何此类变量都必须在函数标头中声明。从父作用域继承变量与使用全局变量不同。全局变量存在于全局范围内,无论执行什么函数,全局变量都是相同的。闭包的父作用域是声明闭包的函数(不一定是从中调用它的函数)。

评论

0赞 user359996 10/10/2010
有趣的错别字一致性(两次都是“拳头”而不是“第一次”)。
0赞 Peter Ajtai 10/10/2010
@user359996 - 谢谢。复制粘贴将做到这一点;)
16赞 lonesomeday 10/10/2010 #3

这里最干净的解决方案是将 A 和 B 方法设置为类,并将公共变量作为私有静态变量。这消除了全局变量的混乱,并允许这两个函数都可以全局访问。

class SomeClass
{
    private static $a = 1;

    public static function a() {
        self::$a = 2;
    }

    public static function b() {
        echo self::$a;
    }
}

然后,您可以调用以下函数:

SomeClass::a();
SomeClass::b();
2赞 Marcus Adams 10/10/2010 #4

我会这样做。这是一种更常见的实现方式。请记住,函数可以传递参数并可以返回值。

// Main
$a = a();
b($a);

function a()
{
  return "my variable";
}

function b($a)
{
 echo $a;
}

您拥有程序的主体,并且变量仍保留在该范围内。全局变量很少使用,从技术上讲也从来不需要。$a

5赞 Pavnish Yadav 4/3/2015 #5

喜欢这个。你可以使用

function a()
{
  global $var; 
  $var = "my variable";
}

function b()
{
 global $var; 
 echo $var;
}
-1赞 Dharmendra Barad 4/4/2017 #6
<?php

class A
{
    private $p;
    private $q;
    private $ans;
    public  function hello()
    {
        echo "Hello PratikPatel";
    }
    public function getdata($a,$b)
    {

        $this->p=$a;
        $this->q=$b;
        $ans=$this ->p/$this->q;
        $this->ans=$ans;

    }
    public function div1()
    {
        echo "your division answer is:=".$this->ans."<br/>";
    }
}
class B extends A
{
    function hello()
    {
        echo "Hello "."<br/>";
    }

}

$p=new B();
$p1=new B();
$p2=new B();
$p -> getdata(20,10);
echo $p1 -> hello();
$p2 -> div1();

?>

此代码有问题,无法打印除法结果

评论

1赞 yakobom 4/4/2017
除了代码之外,了解您的解决方案也很重要 - 请详细说明。另外,不清楚你在最后一句话中想说什么