在类内部PHP全局变量的作用域问题

9

I have the following script

myclass.php

<?php

$myarray = array('firstval','secondval');

class littleclass {
  private $myvalue;

  public function __construct() {
    $myvalue = "INIT!";
  }

  public function setvalue() {
    $myvalue = $myarray[0];   //ERROR: $myarray does not exist inside the class
  }
}

?>

有没有一种简单的声明方式,可以使$myarray在littleclass内可用?我不想将它作为参数传递给构造函数,如果可能的话。
此外,我希望您能够以某种方式使全局变量对php类可见,但这是我第一次面对这个问题,所以我真的不知道。

3
为什么?这与常识180度相左。你有没有阅读文档? - Lightness Races in Orbit
3
警告:使用全局变量会使你的代码很快变成难以维护的混乱状态。考虑将其作为参数传递给构造函数或setvalue(),取决于你的应用程序中哪种方式更合理,以此避免出现问题。 - kapa
1
我没有“阅读文档”,因为我甚至不知道要查找什么。感谢“全局变量”的建议。 - roamcel
我同意@TomalakGeret'kal的观点:你做错了! - PeeHaa
1
感谢您提供的解决方案,bazmegakapa。 - roamcel
5个回答

18

setvalue() 函数开头加入 global $myarray

public function setvalue() {
    global $myarray;
    $myvalue = $myarray[0];
}

更新:
如评论所述,这是不好的做法,应该避免使用。
更好的解决方案可以参考这里:https://dev59.com/5XPYa4cB1Zd3GeqPhEkZ#17094513


3
请注意,这被视为一种不良做法(以及$GLOBALS)。 - kapa
我会简单地说 setvalue($value),数组不应该与类相关。它只是接收一个值。但我们不知道应用程序的逻辑。 - kapa
1
我将此标记为解决方案,因为从技术上讲,这是我的问题的正确答案。未来任何阅读此内容的人请注意,如果可能的话应避免使用这种方法。 - roamcel
6
我们可以编辑以指向最佳实践替代方案吗? - Evan
@Evan,“最佳做法”是随着时间、文化和用例而变化的,但事实是不会改变的。 - Pacerier

3

在一个类中,你可以使用任何全局变量,只需要使用$GLOBALS['varName'];即可。


1
构建一个新的单例类,用于存储和访问您想要使用的变量?

0
 $GLOBALS['myarray'] =  array('firstval','secondval');

在这个类中,你可能会使用 $GLOBALS['myarray']。

0

为什么不直接使用getter和setter来处理这个问题呢?

<?php

    $oLittleclass = new littleclass ;
    $oLittleclass->myarray =  array('firstval','secondval');

    echo "firstval: " . $oLittleclass->firstval . " secondval: " . $oLittleclass->secondval ;

    class littleclass 
    {
      private $myvalue ;
      private $aMyarray ;

      public function __construct() {
        $myvalue = "INIT!";
      }

      public function __set( $key, $value )
      {
        switch( $key )
        {
          case "myarray" :
            $this->aMyarray = $value ;
          break ;
        }
      }

       public function __get( $key )
       {
          switch( $key )
          {
            case "firstval" :
              return $this->aMyarray[0] ;
            break ;
            case "secondval" :
              return $this->aMyarray[1] ;
            break ;
          }    
       }   
    }

    ?>

一行代码解决的问题,这可能有点过于复杂了 :) - roamcel
@Amelia,这是我在这里提出的问题的解决方案吗?http://stackoverflow.com/questions/33613200/php-define-variable-in-global-scope-and-use-it-in-a-class-function?谢谢。 - thednp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接