PHP class: глобальная переменная как свойство в классе

у меня есть глобальная переменная вне моего класса = $MyNumber;


Как объявить это как свойство в myClass?
Для каждого метода в моем классе, это то, что я делаю:

class myClass() {

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

}



Я хочу этого!--3-->

class myClass() {

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

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

}



EDIT: я хочу создать переменную на основе глобального $MyNumber, но
изменено перед использованием в методах

что-то например: var $classNumber = global $MyNumber + 100;

7 ответов


Вы, наверное не действительно хочу это сделать, так как это будет кошмар для отладки, но это кажется возможным. Ключ-это часть, где вы назначаете на ссылка в конструкторе.

$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

что означает, что он назначается по ссылке, а не по значению.

Как я уже сказал, это будет кошмар для отладки, поэтому вы действительно не должны этого делать. Прочтите статья Википедии о инкапсуляция; в принципе, ваш объект должен идеально управлять своими собственными данными и методами, в которых эти данные изменяются; даже общедоступные свойства, как правило, ИМХО, плохая идея.


старайтесь избегать глобальных переменных, вместо этого вы можете использовать что-то вроде этого

class myClass() {
 private $myNumber;

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

теперь вы можете звонить

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

просто использовать глобальные ключевое слово.

например:

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

$MyNumber затем станет доступным (и действительно модифицируемым) в этом методе.

однако использование глобалов часто неодобрительно (они могут испускать плохой запах кода), поэтому вы может использовать одноэлементный класс в магазине ничего подобного. (Опять же, не зная больше о том, что вы пытаетесь достичь, это может быть очень плохо идея-а определение может быть более полезным.)


то, что я испытал, - это то, что вы не можете назначить свою глобальную переменную переменной класса напрямую.

class myClass() {

    public $var = $GLOBALS['variable'];

    public function func() {
         var_dump($this->var);
    }
}

С кодом прямо выше, вы получаете сообщение об ошибке"ошибка синтаксического анализа: синтаксическая ошибка, неожиданные "$ GLOBALS""

но если мы сделаем что-то подобное,

class myClass() {

    public $var = array();

    public function __construct() {
        $this->var = $GLOBALS['variable'];
    }

    public function func() {
         var_dump($this->var);
    }

}

наш код будет работать нормально.

где мы назначаем глобальную переменную переменной класса, она должна быть внутри функции. И я использовал конструктор функция для этого.

таким образом, вы можете получить доступ к глобальной переменной внутри каждой функции класса просто с помощью $это->var;


а как насчет конструктора?

class myClass {

   $myNumber = NULL;

   public function __construct() {
      global myNumber;

      $this->myNumber = &myNumber; 
   }

   public function foo() {
      echo $this->myNumber;
   }

}

или гораздо лучше таким образом (передача глобальной переменной в качестве параметра при inicializin объекта только для чтения)

class myClass {

   $myNumber = NULL;

   public function __construct($myNumber) {
      $this->myNumber = $myNumber; 
   }

   public function foo() {
      echo $this->myNumber;
   }

}
$instance = new myClass($myNumber);

Если вы хотите получить доступ к свойству внутри класса, вам необходимо:

private $classNumber = 8;

класс myClass { защищенный $foo;

public function __construct(&$var)
{
    $this->foo = &$var;
}

public function foo()
{
    return ++$this->foo;
}

}