【问题标题】:PHP class: Global variable as property in classPHP类:全局变量作为类中的属性
【发布时间】:2011-05-28 05:03:11
【问题描述】:

我的 class= $MyNumber; 之外有一个全局变量


如何在 myClass 中将其声明为属性?
对于我班级中的每个方法,我都是这样做的:

class myClass() {

    private function foo() {
         $privateNumber = $GLOBALS['MyNumber'];
    }

}



我想要这个

class myClass() {

    //What goes here?
    var $classNumber = ???//the global $MyNumber;

    private function foo() {
         $privateNumber = $this->classNumber;
    }

}



编辑:我想根据全局 $MyNumber 创建一个变量,但是
在方法中使用之前进行了修改

类似:var $classNumber = global $MyNumber + 100;

【问题讨论】:

  • 更重要的问题是:你为什么需要它?这里可能存在设计错误。
  • @elusie:我想在我的课程中以不同的方式引用 $MyNumber
  • 为什么首先需要一个全局变量?大多数情况下不需要它们。那个全局变量是干什么用的?
  • PHP 没有指针。它确实有引用,有时像指针一样工作,但它们不是。不要试图模拟指针功能;你只会给未来带来巨大的痛苦——你试图调试它。

标签: php class variables methods


【解决方案1】:

只需使用global keyword

例如:

class myClass() {
    private function foo() {
        global $MyNumber;
        ...

$MyNumber 然后将在该方法中变得可访问(并且实际上是可修改的)。

但是,全局变量的使用通常会受到反对(它们会散发出难闻的代码味道),因此您可能想要考虑使用单例类来存储这种性质的任何内容。 (再说一次,如果不知道更多关于你想要实现的目标,这可能是一个非常糟糕的主意 - define 可能会更有用。)

【讨论】:

    【解决方案2】:

    如果你想从一个类中访问一个属性,你应该:

    private $classNumber = 8;
    

    【讨论】:

      【解决方案3】:

      尽量避免使用全局变量,而是可以使用类似的东西

      class myClass() {
       private $myNumber;
      
       public function setNumber($number) {
        $this->myNumber = $number;
       }
      }
      

      现在你可以打电话了

      $class = new myClass();
      $class->setNumber('1234');
      

      【讨论】:

        【解决方案4】:

        使用构造函数呢?

        class myClass {
        
           $myNumber = NULL;
        
           public function __construct() {
              global myNumber;
        
              $this->myNumber = &myNumber; 
           }
        
           public function foo() {
              echo $this->myNumber;
           }
        
        }
        

        或者这样更好(在初始化对象时将全局变量作为参数传递 - 只读)

        class myClass {
        
           $myNumber = NULL;
        
           public function __construct($myNumber) {
              $this->myNumber = $myNumber; 
           }
        
           public function foo() {
              echo $this->myNumber;
           }
        
        }
        $instance = new myClass($myNumber);
        

        【讨论】:

          【解决方案5】:

          您可能真的想要这样做,因为这将是调试的一场噩梦,但它似乎是可能的。关键是您在构造函数中通过 reference 分配的部分。

          $GLOBALS = array(
              'MyNumber' => 1
          );
          
          class Foo {
              protected $glob;
          
              public function __construct() {
                  global $GLOBALS;
                  $this->glob =& $GLOBALS;
              }
          
              public function getGlob() {
                  return $this->glob['MyNumber'];
              }
          }
          
          $f = new Foo;
          
          echo $f->getGlob() . "\n";
          $GLOBALS['MyNumber'] = 2;
          echo $f->getGlob() . "\n";
          

          输出将是

          1
          2
          

          这表明它是通过引用而不是值分配的。

          正如我所说,调试将是一场噩梦,所以你真的不应该这样做。阅读encapsulation 上的维基百科文章;基本上,您的对象应该理想地管理自己的数据以及修改该数据的方法;恕我直言,即使是公共财产通常也是个坏主意。

          【讨论】:

          • 谢谢。是的,调试起来可能是一场噩梦。但是如果不想在类中的每个方法中为变量编写 global 关键字,并且仍然希望它代表原始的全局变量(以防它的状态在类外发生变化),这个解决方案看起来不错。谢谢!
          • 是的,它会起作用,但如果可能的话,最好避免使用全局变量。
          • 当然可以,但是如果它们是唯一的和静态的,它对于设置全局配置变量很有用,而不必像 mrwooster 的示例那样显式调用方法。例如,URI、访问令牌、密码等,在应用程序中将被使用。基本上,除非您知道数据是动态的,否则以这种方式“手动”调用方法来初始化变量是多余的。
          • 或者更好的是,根本没有全局(在 PHP 意义上)配置变量。为您的配置注入某种容器并将其传递到需要它的地方。
          【解决方案6】:

          我的经验是不能直接将全局变量赋值给类变量。

          class myClass() {
          
              public $var = $GLOBALS['variable'];
          
              public function func() {
                   var_dump($this->var);
              }
          }
          

          使用上面的代码,您会收到一条错误消息“Parse error: syntax error, unexpected '$GLOBALS'

          但如果我们这样做,

          class myClass() {
          
              public $var = array();
          
              public function __construct() {
                  $this->var = $GLOBALS['variable'];
              }
          
              public function func() {
                   var_dump($this->var);
              }
          
          }
          

          我们的代码可以正常工作。

          我们将全局变量分配给类变量的位置必须在函数内部。我为此使用了构造函数。

          因此,您可以在类的每个函数中访问您的全局变量,只需使用 $this->var;

          【讨论】:

            【解决方案7】:
            class myClass 
            {
            protected $foo;
            
            public function __construct(&$var)
            {
                $this->foo = &$var;
            }
            
            public function foo()
            {
                return ++$this->foo;
            }
            }
            

            【讨论】:

            • 请使用正确的格式,不要只发布代码,详细说明您的答案。
            猜你喜欢
            • 2013-09-23
            • 2012-01-19
            • 2015-11-23
            • 2019-11-07
            • 2013-02-10
            • 2017-11-20
            • 2013-02-21
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多