Php статические свойства и методы

Ключевое слово «static»

Эта страница описывает использование ключевого слова static для определения статических методов и свойств. static также может использоваться для определения статических переменных и позднего статического связывания. Для получения информации о таком применении ключевого слова static пользуйтесь вышеуказанными страницами.

Объявление свойств и методов класса статическими позволяет обращаться к ним без создания экземпляра класса. Атрибут класса, объявленный статическим, не может быть доступен посредством экземпляра класса (но статический метод может быть вызван).

В целях совместимости с PHP 4, сделано так, что если не использовалось определение области видимости, то член или метод будет рассматриваться, как если бы он был объявлен как public.

Так как статические методы вызываются без создания экземпляра класса, то псевдо-переменная $this не доступна внутри метода, объявленного статическим.

Доступ к статическим свойствам класса не может быть получен через оператор ->.

При попытке вызова нестатических методов статически выводится предупреждение уровня E_STRICT .

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

Начиная с версии PHP 5.3.0 существует возможность ссылаться на класс используя переменную. Поэтому значение переменной в таком случае не может быть ключевым словом (например, self, parent и static).

Пример #1 Пример статического свойства

class Foo
public static $my_static = ‘foo’ ;

public function staticValue () return self :: $my_static ;
>
>

class Bar extends Foo
public function fooStatic () return parent :: $my_static ;
>
>

$foo = new Foo ();
print $foo -> staticValue () . «\n» ;
print $foo -> my_static . «\n» ; // Не определено свойство my_static

print $foo :: $my_static . «\n» ; // Начиная с PHP 5.3.0
$classname = ‘Foo’ ;
print $classname :: $my_static . «\n» ; // Начиная с PHP 5.3.0

print Bar :: $my_static . «\n» ;
$bar = new Bar ();
print $bar -> fooStatic () . «\n» ;
?>

Пример #2 Пример статического метода

Foo :: aStaticMethod ();
$classname = ‘Foo’ ;
$classname :: aStaticMethod (); // Начиная с PHP 5.3.0
?>

Источник

Php статические свойства и методы

Кроме обычных методов и свойств с разными модификаторами доступа класс может содержать статические методы и свойства. Такие методы и свойства помечаются ключевым словом static . Статические методы и свойства содаются один раз для всего класса и относятся ко всему классу, тогда для нестатических свойств и методов создается отдельная копия для каждого объекта.

name = $name; $this->age = $age; > function sayHello() < echo "Привет, меня зовут $this->name
"; > static function printPerson($person) < echo "Имя: $person->name Возраст: $person->age
"; > > ?>

Здесь определено статическое свойство retirenmentAge , которое хранит пенсионный возраст. Если возраст — это показатель конкретного человека и может отличаться для разных людей, то пенсионный возраст, как правило, устанавливается общий для всех. Поэтому это свойство можно сделать статическим — оно относится ко всему классу Person, а не устанавливается отдельно для каждого объекта. Для объявления статического свойства перед его именем ставится модификатор static :

static $retirenmentAge = 65;

Также в классе определен статический метод printPerson() , который выводит информацию о человеке, который в качестве параметра передается в метод. Этот метод также не зависит от конкретного объекта класса Person, а относится ко всему классу Person в целом. Чтобы объявить статический метод, также перед словом function ставится модификатор static :

static function printPerson($person) < echo "Имя: $person->name Возраст: $person->age
"; >

При обращении к статическим методам и свойствам используется имя класса и оператор :: , вместо операции доступа -> , так как статический метод относится ко всему классу, а не к конкретному объекту этого класса.

name = $name; $this->age = $age; > function sayHello() < echo "Привет, меня зовут $this->name
"; > static function printPerson($person) < echo "Имя: $person->name Возраст: $person->age
"; > > $tom = new Person("Tom", 36); // вызов нестатического метода $tom->sayHello(); // вызов статического метода Person::printPerson($tom); // обращение к статическому свойству echo "Пенсионный возраст: " . Person::$retirenmentAge . "
"; ?>
Привет, меня зовут Tom Имя: Tom Возраст: 36 Пенсионный возраст: 65

Для обращения к статическим свойствам и методам внутри класса вместо имени класса может применяться ключевое слово self . Например, добавим в класс человека метод, который будет вычислять, сколько человеку осталось до пенсии:

name = $name; $this->age = $age; > function sayHello() < echo "Привет, меня зовут $this->name
"; > static function printPerson($person) < echo "Имя: $person->name Возраст: $person->age
"; > function checkAge() < if($this->age >= self::$retirenmentAge) echo "Пора на пенсию
"; else echo "До пенсии еще " . (Person::$retirenmentAge - $this->age) . " лет
"; > > $tom = new Person("Tom", 36); $tom->checkAge(); ?>

Стоит отметить, что в статических методах мы можем обращаться только к статическим свойствам и методам. Но не можем обращаться к НЕстатическим свойствам и методам через $this . Например:

static function printPerson($person) < echo "Имя: $person->name Возраст: $person->age
"; // в статических методах можно обращаться к статическим методам и свойствам echo "Пенсионный возраст: " . self::$retirenmentAge . "
"; // но нельзя обращаться к нестатическим методам и свойствам // echo "Имя: " . $this->name . "
"; // так нельзя // $this->sayHello(); // так нельзя >

Здесь в статическом методе printPerson() мы можем обратиться к статической переменной retirenmentAge :

echo "Пенсионный возраст: " . self::$retirenmentAge . "
";

Но не можем обратиться к нестатическим свойствам и методам:

// echo "Имя: " . $this->name . "
"; // так нельзя // $this->sayHello(); // так нельзя

При этом статические методы и свойства также могут иметь модификаторы доступа. Например, изменим класс Person следующим образом:

id = self::$counter; $this->name = $name; > static function getCounter() < return self::$counter; >function getId() < return $this->id; > > $tom = new Person("Tom"); $bob = new Person("Bob"); echo "$tom->name имеет id: " . $tom->getId() . "
"; echo "$bob->name имеет id: " . $bob->getId() . "
"; echo "Всего пользователей: " . Person::getCounter(); ?>

В классе Person определено свойство $id , которое представляет идентификатор пользователя. И также определено приватное сттическое свойство $counter , которое хранит общее количество созданных пользователей. В конструкторе мы увеличиваем статическую переменную на единицу, а затем устанавливаем ее значение для свойства $id.

Количество созданных пользователей — это атрибут, общий для всего класса, который независит от конкретного объекта. Однако в то же время нежелательно, чтобы его извне могли произвольно изменить. Поэтому свойство $counter определено как приватное. А чтобы увидеть его значение, определен статический метод getCounter() .

Tom имеет id: 1 Bob имеет id: 2 Всего пользователей: 2

Источник

Читайте также:  Python crash course 3rd edition pdf
Оцените статью