Почему статическая переменная-член наследует значение при создании экземпляра объекта несколько раз в PHP?

#php #oop #static

#php #ооп #статический

Вопрос:

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

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

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

 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, которое он принимает, даже если переданный аргумент пуст. Это ошибка? или я что-то упускаю?

Ответ №1:

Такова природа 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
  

Редактировать

Вы можете понять это следующим образом:-

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

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

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

 $a = new ClassNameA(12);
  

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

 $a = new ClassNameA(23);
  

Что он делает, так это присваивает name свойству значение 23 для object a ;

Но когда свойство static это для всего класса, а не для какого-либо объекта.

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

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

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

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

Комментарии:

1. о, так значит ли это, что область действия Статической переменной является глобальной?

2. Спасибо вам за такое приятное объяснение. я действительно понял, что вы пытаетесь сказать.:)

Ответ №2:

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

 class Example {
  static public $var;

  static public MyFunction() {
    echo "MyFunctionn";
  }
}

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

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

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

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

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

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

Комментарии:

1. Хорошо, то есть вы хотите сказать, что как только я объявляю его и инициирую объект или если он был загружен в память, он становится глобальным, и я могу получить к нему доступ в любом месте?

2. Она глобальная и к ней можно получить доступ из любого места при условии, что ее область действия общедоступна. У вас также могут быть статические методы.