Php static method construct

Php static method construct

Кроме обычных методов и свойств с разными модификаторами доступа класс может содержать статические методы и свойства. Такие методы и свойства помечаются ключевым словом 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

Источник

Как реализовать аналог статического конструктора в классе PHP?

Как реализовать аналог статического конструктора в классе PHP.
Чтобы статические методы могли обращаться к статическим свойствам?

27cm

Вот в C# есть кроме обычного конструктора статический конструктор. суть его в том что при любом ПЕРВОМ обращении к статическим свойствам класса перед этим обращением выполняется статический конструктор. В котором определяются свойства для класса.

Похоже, что никак. Чтобы перед обращением к статическому свойству отработал какой-либо метод (статический конструктор), нужен аналог «магического» метода __get() для статических свойств, а такой в PHP отсутствует. Более того, даже если бы такой метод был, он бы не срабатывал если статическое свойство уже определено в классе, пришлось бы принудильно делать unset() для всех статических свойств, что приведёт к ошибке.

Поэтому вижу только один выход: обращайтесь к статическим свойствам через статические get-методы, в которых уже и вызывайте «статический конструктор».

 static public function getBar() < return static::__getStatic('bar'); >/** * Вызывает __constructorStatic() при первом обращении * и возвращает значение статического свойства $name. * * @param string $name Имя статического свойства класса. */ static protected function __getStatic($name) < static $called = false; if (!$called) < $called = true; self::__constructorStatic(); >return static::$; > /** * "Статический конструктор" класса. */ static private function __constructorStatic() < static::$bar++; static::$foo++; >>

Источник

PHP OOP Static

In all the previous chapters, we created objects from classes before accessing methods and properties of it.

Static Methods

Static methods and properties can be considered as escaping from Object-Oriented Programming.

Static Methods — Declaration

The static keyword is used to declare static methods.

A visibility modifier may be added before the static keyword. If there’s no visibility declaration, the visibility will be public. The same rules we learned in the visibility chapter are applied for each visibility.

Static Methods — Accessing

  • Static methods can be accessed from outside the class using the class name and Scope Resolution Operator ( :: ). (Only if the visibility is public)

PHP Static Methods Example

  > echo Hyvor::getDevSiteDomain(); 
 class OtherClass extends MyClass < public function myMethod() < # visibility of myStaticMethod should be is public or protected MyClass::myStaticMethod(); # or parent::myStaticMethod(); >> 

PHP Static Methods with Inheritance Example

  > class HyvorAuth extends Hyvor < public $companyName; public function __construct() < $this ->companyName = parent::getCompanyName(); > > $hyvorAuth = new HyvorAuth; echo $hyvorAuth -> companyName; // ERROR will be thrown // echo Hyvor::getCompanyName(); 
 class MyClass < public static function myStaticMethod() < echo "Hyvor!"; >public function myMethod() < self::myStaticMethod(); >> 

Static Methods — Example

PHP Static Methods Example

  public function __construct() < self::callMe(); >> MyClass::callMe(); echo "
"; new MyClass();

As you see in the above example, a class can have both static and non-static methods.

Static Properties

Static properties are properties that can be used without instantiating (or creating objects from classes).

Static Properties — Declaring

Static Properties — Accessing

Accessing static properties are done in the same way as static methods. The same visibility rules apply.

Static Properties — Example

PHP Static Properties Example

  > echo MyClass::$name . '
'; MyClass::$name = 'Hyvor Developer'; new MyClass();
  • In the class, we declare a static property named $name and the constructor function.
  • Then, we echo the $name from outside the class. (Line break added for a handy output)
  • Then, we change the value of the $name static property. Changing the value of a static property is done in the same way as normal variables.
  • Finally, we create a new instance from MyClass. So, the constructor function will be called. We access the static $name from the constructor using the self keyword and ::

self:: is available when you call a non-static method. But, $this is not available when you call a static method.

Why Static Methods and Properties?

Static methods and properties are widely used in PHP, especially to provide additional support for classes. Most of the time static methods are used to declare Helper and Utility functions. So, why not use normal functions for that? Truly, Object-Oriented concept gives you more ability to organize and recall your functions. One of the strongest features in OOP is autoloading, which we will learn later. Therefore, having your helper or utility functions inside a class lets you easily access them.

Here’s an example usage of static methods in a class.

Usage of Static Methods in a Class

  firstname = self::filterName($firstname); $this -> lastname = self::filterName($lastname); > /** * @param string $name - name to filter * @return string - filtered name */ static function filterName($name) < // remove surrounding whitespaces $name = trim($name); // remove non-latin and non-number characters $name = preg_replace('/[^a-zA-Z0-9]/', '', $name); return $name; >> $user = new User('Michael ', '$Jackson'); echo $user -> firstname . ' ' . $user -> lastname; 

Here’s a little explanation

Now you understand that a class can be fully static (all the methods are static). Or, you can add some static methods to a class to extend the functionalities of it as the above example.

Источник

Читайте также:  Css table vertical scrolling
Оцените статью