#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. Она глобальная и к ней можно получить доступ из любого места при условии, что ее область действия общедоступна. У вас также могут быть статические методы.