Что PHP-эквивалент статической переменной в других языках?

Мне интересно, есть ли в PHP тип переменной в классах, который работает как статический на других языках. И под этим я подразумеваю, что все объекты одного и того же класса используют одну и ту же переменную, и когда она обновляется для одного, она обновляется для всех. Static близок, потому что он является общим для всех объектов, но мне нужно иметь возможность его обновлять. Придется ли мне использовать глобальные переменные для этого?


person fent    schedule 29.07.2009    source источник
comment
С каких это пор нельзя обновлять статические свойства?   -  person jason    schedule 29.07.2009
comment
Статические переменные могут быть изменены...   -  person Michael Burr    schedule 29.07.2009
comment
Постоянные переменные не могут быть изменены; статические переменные могут быть.   -  person Extrakun    schedule 29.07.2009
comment
И «final» - это вещь Java, а не вещь C, и она не имеет ничего общего с созданием переменной «общий класс».   -  person Michael Burr    schedule 29.07.2009


Ответы (6)


Я думаю, что статика - это то, что вам нужно. Вы можете обновить статическую переменную, вам просто нужно сделать это в «статическом контексте» (то есть с помощью оператора ::.

class Class1 {
    protected static $_count = 0;

    public function incrementCount() {
        return self::$_count++;
    }
}

$instance1 = new Class1();
$instance2 = new Class1();
var_dump($instance1->incrementCount(), $instance2->incrementCount());

выведет:

целое 0

целое 1

person Brenton Alker    schedule 29.07.2009
comment
В этом была проблема. Я использовал $this вместо ::. - person fent; 29.07.2009

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

static имеет то свойство, что оно будет иметь одинаковое значение для всех экземпляров класса, поскольку оно не привязано к конкретному экземпляру.

Вам нужно будет использовать оператор :: для доступа к нему, потому что, будучи статическим, вы не можете использовать ->.

person thomasrutter    schedule 29.07.2009

Вы можете обновлять статические свойства:

class A {
   protected static $_foo = 0;

   public function increment()
   {
       self::$_foo++;
   }   

   public function getFoo()
   {
       return self::$_foo;
   }
}


$instanceOne = new A();
$instanceTwo = new A();


$instanceOne->getFoo(); // returns 0

$instanceTwo->increment();

$instanceOne->getFoo(); // returns 1
person jason    schedule 29.07.2009

Вы можете просто создать переменные в файле PHP, скажем, с именем Constants.

--Constants.php-- $DATABASE_NAME = "mysql"

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

person Dhruva Sagar    schedule 29.07.2009

Я думаю, static это ключевое слово, которое вы ищем.

И нет ничего, что мешало бы "обновлению" свойства static в PHP: оно инициализируется при первой установке, оно сохраняет свое значение во время выполнения PHP-скрипта, но вы определенно можете установить для него новое значение.

person Pascal MARTIN    schedule 29.07.2009

Я не понимаю, почему создание переменной static не работает для того, что вы описали (но это не имеет ничего общего с ключевым словом final)?

<?php

class Bla
{
    public static $var;

    public function __construct()
    {
        Bla::$var = Bla::$var + 1;
    }
}

$test = new Bla();
echo Bla::$var; // 1
$test = new Bla();
echo Bla::$var; // 2

?>
person Daff    schedule 29.07.2009