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);
класс myClass { защищенный $foo;
public function __construct(&$var)
{
$this->foo = &$var;
}
public function foo()
{
return ++$this->foo;
}
}