Почему переменная-член Static наследует значение при создании экземпляра объекта в PHP несколько раз? - PullRequest
2 голосов
/ 11 июня 2011

Я тестировал Статическое Ключевое слово на том, как именно оно работает, и я столкнулся с этим, что я не понимаю, что происходит.

Рассмотрим два класса ClassNameA & ClassNameB со следующими кодами.

ClassNameA без статического ключевого слова

class ClassNameA
{
    private $name;

    public function __construct($value) {
        if($value != '') {
            $this->name = $value;
        }
        $this->getValue();
    }
    public function getValue() {
        echo $this->name;
    }
}

ClassNameBсо статическим ключевым словом

class ClassNameB
{
    private static $name;

    public function __construct($value) {
        if($value != '') {
            self::$name = $value;
        }
        $this->getValue();
    }
    public function getValue() {
        echo self::$name;
    }
} 

Когда я создаю экземпляр объекта несколько раз, используя ClassNameA

$a = new ClassNameA(12);
echo '<br/>';
$a = new ClassNameA(23);
echo '<br/>';
$a = new ClassNameA(''); //Argument given is Empty here

, он выводит следующее

12
23

И теперь, когда ясоздание экземпляра объекта несколько раз с использованием ClassNameB

$a = new ClassNameB(12);
echo '<br/>';
$a = new ClassNameB(23);
echo '<br/>';
$a = new ClassNameB(''); //Argument given is Empty here

. Он выводит следующее

12
23
23

Обратите внимание на дополнительное значение 23, которое он принимает, даже если аргумент Passed равен Empty.Это ошибка?или я что-то упустил?

Ответы [ 2 ]

4 голосов
/ 11 июня 2011

Такова природа static собственности.Статическое свойство является своего рода свойством класса, а не свойством объекта.

Когда вы передали пробел, в соответствии с условием значение статического свойства не будет обновлено, а последнее значение все еще будет в статическом.свойство.

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

$a = new ClassNameB(12); //static property is set to 12
echo '<br/>';
$a = new ClassNameB(23); //static property is update to 23
echo '<br/>';
$a = new ClassNameB(''); //static property is not updated here it is still 23

EDIT

Вы можете понять так: -

if($value != '') {
    $this->name = $value; //
 }

То, что делает код выше, это установка значения свойства для текущего объекта (объекта, который инициализируется прямо сейчас).

Так что, когдавы написали

$a = new ClassNameA(12);

Что он делает, это устанавливает для свойства name значение 12 для объекта a;

$a = new ClassNameA(23);

Что он делает, так это устанавливаетname свойство для 23 для объекта a;

Но когда свойство равно static, то есть для всего класса, а не для любого объекта.

так, когда вы писали

if($value != '') {
    self::$name = $value;
 }

Приведенный выше код устанавливаетc стоимость имущества.Обратите внимание, что здесь вы написали self вместо $this, что позволяет использовать его только для этого класса, а не для какого-либо объекта.

Я пытался объяснить это лучше, но не знаю, как он объясняетдля вас.

2 голосов
/ 11 июня 2011

Статический член - это один экземпляр во всем приложении, а не один раз на объект.Например,

class Example {
  static public $var;

  static public MyFunction() {
    echo "MyFunction\n";
  }
}

Example::$var = 123;
echo Example::$var;
Example::MyFunction();

Обратите внимание, что нам не нужно было создавать экземпляр класса «Example», по сути, его имя разделяя переменную с классом.Это было бы неверно:

$example = new Example();
echo $example->var;
$example->MyFunction();

Вы также можете ссылаться на него внутри класса как

self::$var
self::MyFunction();

, что делает безопасным переименование класса позже, если вам нужно.Статическая функция не может получить доступ к нестатическому члену или методу.

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