Почему статические свойства недоступны ->, но статическая функция доступна?

0

У меня есть код ниже

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

----------------
  1. У меня есть доступ к статическому методу путем создания объекта (с помощью ->) и с помощью оператора разрешения области (с использованием: :) Метод работает правильно Но когда я пытаюсь использовать статическое свойство по разрешению области (с помощью ::), оно показывает уведомление не работает, ниже приведен дополнительный код.

    $obj-> рассчитывать; //Примечание: Неопределенное свойство: MyClass :: $ count

  2. У меня есть доступ к статическому методу, создавая объект (используя ->) и оператор разрешения области видимости (используя: :) НО все еще статические значения счетчика увеличиваются ПОЧЕМУ?

  3. Почему различное правило доступа для статического свойства (only ::) и метода (by ->,: :)?

  • 0
    Вы можете использовать -> когда вы создаете экземпляр класса как объект. :: это когда вы хотите вызвать что-то static . Вы не можете получить доступ к ->$count потому что это член класса, и вы можете получить доступ с помощью :: когда вы не создали экземпляр.
  • 0
    возможный дубликат статического метода Call из экземпляра в PHP, будущее устаревание?
Показать ещё 3 комментария
Теги:
class
oop
static
static-methods

1 ответ

-1

В вашем примере это выглядит странно, но представьте, если бы вы также

class MyOtherClass
{
    public $count = 0;

    public function plusOne()
    {
        return "The other count is " . ++$this->count . ".<br />";
    }
}

Теперь, если вы хотите сделать

$obj->plusOne();

Вы можете это сделать, и он будет работать независимо от того, является ли $ obj MyClass или MyOtherClass. Детали реализации не важны на данный момент, если вы их уже не знаете - например. вы можете использовать MyClass :: plusOne() без его создания, потому что вы знаете, что статический метод.

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

  • 0
    Спасибо. Но мне нужно знать, почему разница в доступе к статической переменной и статической функции не является альтернативным кодом.
  • 0
    Несомненно, код просто предназначен для иллюстрации сути: когда вы обращаетесь к методу переменной, эта переменная не всегда может быть одним и тем же классом. Он может иметь класс, где этот метод является статическим, или может иметь класс, где его нет. Используя -> вы можете вызвать данный метод в любом случае.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню