it-swarm.com.ru

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

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

27
Zebra

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

$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

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

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

47
El Yobo

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

class myClass() {
 private $myNumber;

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

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

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

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

например.:

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

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

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

6
John Parker

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

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);
2
Petr Peller

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

class myClass() {

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

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

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

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

class myClass() {

    public $var = array();

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

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

}

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

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

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

2
emre

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

private $classNumber = 8;
1
Gal

class myClass { защищенный $ foo;

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

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

}

0
Xerxes