У меня есть код ниже
class MyClass
{
public static $count = 0;
public static function plusOne()
{
return "The count is " . ++self::$count . ".<br />";
}
}
$obj = new MyClass;
$obj->plusOne(); //Works proper for static function
echo '<br/>'.MyClass::$count; // count: 1
MyClass::plusOne(); //Works proper for static function
echo '<br/>'.MyClass::$count; // count: 2
----OUTPUT------
1
2
----------------
У меня есть доступ к статическому методу путем создания объекта (с помощью ->) и с помощью оператора разрешения области (с использованием: :) Метод работает правильно Но когда я пытаюсь использовать статическое свойство по разрешению области (с помощью ::), оно показывает уведомление не работает, ниже приведен дополнительный код.
$obj-> рассчитывать; //Примечание: Неопределенное свойство: MyClass :: $ count
У меня есть доступ к статическому методу, создавая объект (используя ->) и оператор разрешения области видимости (используя: :) НО все еще статические значения счетчика увеличиваются ПОЧЕМУ?
Почему различное правило доступа для статического свойства (only ::) и метода (by ->,: :)?
В вашем примере это выглядит странно, но представьте, если бы вы также
class MyOtherClass
{
public $count = 0;
public function plusOne()
{
return "The other count is " . ++$this->count . ".<br />";
}
}
Теперь, если вы хотите сделать
$obj->plusOne();
Вы можете это сделать, и он будет работать независимо от того, является ли $ obj MyClass или MyOtherClass. Детали реализации не важны на данный момент, если вы их уже не знаете - например. вы можете использовать MyClass :: plusOne() без его создания, потому что вы знаете, что статический метод.
Статические переменные всегда статичны, как объявлено. Нет данных о экземпляре - так что независимо от того, какой объем вы используете при его обновлении, он будет обновлять статический счетчик.
->
когда вы создаете экземпляр класса как объект.::
это когда вы хотите вызвать что-тоstatic
. Вы не можете получить доступ к->$count
потому что это член класса, и вы можете получить доступ с помощью::
когда вы не создали экземпляр.