Global variable inside a constructor with PHP

2020-04-05 18:01发布

问题:

This should be obvious, but I'm getting a bit confused about PHP variable scope.

I have a variable inside a Constructor, which I want to use later in a function in the same class. My current method is this:

<?php

class Log(){

   function Log(){
      $_ENV['access'] = true;
   }

   function test(){
      $access = $ENV['access'];
   }

}

?>

Is there a better way to do this than abusing environment variables? Thanks.

回答1:

You could use a class variable, which has a context of... a class :
(Example for PHP 5, of course ; I've re-written a few things so your code is more PHP5-compliant)

class Log {
   // Declaration of the propery
   protected $_myVar;

   public function __construct() {
      // The property is accessed via $this->nameOfTheProperty :
      $this->_myVar = true;
   }

   public function test() {
      // Once the property has been set in the constructor, it keeps its value for the whole object :
      $access = $this->_myVar;
   }

}

You should take a look at :

  • The "Classes and Objects" section of the PHP manual
  • And, for this specific question, the sub-section Properties


回答2:

Globals are considered harmful. If this is an outside dependency, pass it through the constructor and save it inside a property for later use. If you need this to be set only during the call to test, you might want to consider making it an argument to that method.



回答3:

You could use the global keyword:

class Log{
    protected $access;
    function Log(){
        global $access;
        $this->access = &$access;
    }
}

But you really should be passing the variable in the constructor:

class Log{
    protected $access;
    function Log($access){
        $this->access = &$access;
    }
    //...Then you have access to the access variable throughout the class:
    function test(){
        echo $this->access;
    }
}


标签: php oop scope