Класс PHP: глобальная переменная как свойство в классе - PullRequest
29 голосов
/ 20 декабря 2010

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

}

РЕДАКТИРОВАНИЕ: Я хочу создать переменную, основанную на глобальном $ MyNumber, но
измененную перед использованием в методах

что-то вроде: var $ classNumber =глобальный $ MyNumber + 100;

Ответы [ 7 ]

50 голосов
/ 20 декабря 2010

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

$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

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

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

10 голосов
/ 20 декабря 2010

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

class myClass() {
 private $myNumber;

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

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

$class = new myClass();
$class->setNumber('1234');
6 голосов
/ 20 декабря 2010

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

, например:

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

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

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

2 голосов
/ 08 декабря 2013

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

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 ;

2 голосов
/ 20 декабря 2010

А как насчет использования конструктора?

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);
1 голос
/ 20 декабря 2010

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

private $classNumber = 8;
0 голосов
/ 05 декабря 2017

class myClass {protected $ foo;

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

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

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...