Привет, у меня возникла следующая простая проблема:

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

class task
{
    static $tid = 0;

    function __construct()
    {
        $this->tid++;
    }   
}

Это возвращает следующее сообщение об ошибке:

Notice: Undefined property: task::$tid in ... on line ...

Как это сделать правильно? Заранее спасибо :)

РЕДАКТИРОВАТЬ:

Извините, ясно, что этот подход не работает, потому что ключевое слово static указывает, что свойство не привязано к экземпляру, поэтому -> не работает. Но как это сделать правильно?

$tid++ не работает. Ошибка: неопределенная переменная.

php
3
Alex 8 Фев 2016 в 02:10

2 ответа

Лучший ответ

Согласно руководству по PHP:

К статическим свойствам нельзя получить доступ через объект с помощью оператора стрелки ->. Как и любая другая статическая переменная PHP, статические свойства могут быть инициализированы только с помощью литерала или константы до PHP 5.6; выражения не допускаются.

Однако выход есть. Вы должны использовать ключевое слово self:

class Task
{
    static $tid = 0;

    function __construct()
    {
        self::$tid++;
    }   
}

new Task();
new Task();

echo Task::$tid;

Выведет 2

4
Alex Karshin 7 Фев 2016 в 23:47

Следующее будет увеличивать статику каждый раз, когда вы создаете новый экземпляр класса. Вы должны использовать ключевое слово self. Затем вы можете получить доступ к значению с помощью $var::$tid или создать функцию для возврата значения. Следующее вернет 1122. Конечно, как указывает Норденхайм, вам не нужен получатель fn, если $ tid равно public static. Если это private static, геттер разрешит доступ к нему.

class task
{
    public static $tid = 0;

    public function __construct()
    {
        self::$tid++;
    }   

    public function gettid(){
    return self::$tid;
    }

}

$a = new task;
echo ($a->gettid());
echo $a::$tid;

$b = new task;
echo ($b->gettid());
echo $b::$tid;
3
mseifert 8 Фев 2016 в 00:00