У меня есть глобальная переменная вне моего класса = $ 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; } }
EDIT: я хочу создать переменную, основанную на глобальном $ MyNumber, но
изменен, прежде чем использовать его в методах
что-то вроде: var $ classNumber = global $ MyNumber + 100;
Вероятно, вы действительно не хотите этого делать, потому что это будет кошмар для отладки, но, похоже, это возможно. Ключ – это та часть, которую вы назначаете по ссылке в конструкторе.
$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');
Просто используйте ключевое слово global .
например:
class myClass() { private function foo() { global $MyNumber; ...
$ MyNumber станет доступным (и действительно модифицируемым) внутри этого метода.
Тем не менее, использование globals часто нахмурило apon (они могут дать плохой запах кода), поэтому вы можете захотеть использовать одноэлементный класс для хранения чего-либо подобного. (Опять же, не зная больше о том, чего вы пытаетесь достичь, может быть очень плохая идея – определение может быть более полезным).
То, что я испытал, заключается в том, что вы не можете напрямую назначить свою глобальную переменную классу.
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); } }
Наш код будет работать нормально.
Если мы назначаем глобальную переменную переменной класса, она должна находиться внутри функции. И я использовал функцию конструктора для этого.
Таким образом, вы можете получить доступ к своей глобальной переменной внутри каждой функции класса, просто используя $ this-> var ;
Как насчет использования конструктора?
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);
Если вы хотите получить доступ к собственности внутри класса, вам необходимо:
private $classNumber = 8;
class myClass {protected $ foo;
public function __construct(&$var) { $this->foo = &$var; } public function foo() { return ++$this->foo; }
}