Подтвердить что ты не робот

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

У меня есть глобальная переменная вне моего класса = $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;

4b9b3361

Ответ 1

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

$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

который указывает, что он присваивается ссылкой, а не значением.

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

Ответ 2

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

class myClass() {
 private $myNumber;

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

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

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

Ответ 3

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

например:.

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

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

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

Ответ 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

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

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;

Ответ 6

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

private $classNumber = 8;

Ответ 7

класс myClass {   protected $foo;

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

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

}