Рубрики
Uncategorized

Разница между self и static в объектно-ориентированном программировании PHP

Автор оригинала: David Wong.

В этой статье рассматривается разница между самостоятельным и статическим в объектно-ориентированном программировании PHP. Чтобы поделиться с вами для вашей справки, следующим образом:

1. Предположим, у нас есть класс автомобиля, который имеет два метода: модель() и получить модель ()|/.

class Car{
 public function model(){
  //Here we use the keyword self
  self::getModel();
 }
 protected function getModel(){
  echo 'I am car';
 }
}

После создания экземпляра метод вызова является:

$car = new Car();
$car - > model(); // output: I am car

Ключевое слово self заставляет нас вызывать метод getmodel () класса car и выводить текст “Я-автомобиль”.

2. Добавьте новый класс в качестве подкласса класса автомобилей:

class Mercedes extends Car
{
 protected function getModel()
 {
  echo "I am mercedes";
 }
}
//Call the model () method after instantiation
$mercedes = new Mercedes();
$mercedes->model();

Мы знаем, что подкласс унаследует метод родительского класса, и мы переопределяем метод getmodel () в подклассе Mercedes. В этом случае создание экземпляра класса Mercedes и вызов метода model() выведет строку “Я автомобиль” или “Я Мерседес”?

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

Но фактический результат таков:

Я-машина

почему?

3. Принцип работы ключевого слова self заключается в следующем: Он вызовет метод текущего класса

поскольку model() Метод определен только в классе автомобиля, поэтому для self текущий класс-это класс автомобиля. self::getModel() Предназначен для вызова метода getmodel в классе car.

Кажется, что это не то, чего мы хотим, как это решить?

4. Решение 1. перезапись в классе Mercedes модель() Метод

class Mercedes extends Car
{
 public function model(){
  //Here we use the keyword self
  self::getModel();
 }
 protected function getModel()
 {
  echo "I am mercedes";
 }
}
//Call the model () method after instantiation
$mercedes = new Mercedes();
$Mercedes - > model(); // output: I am Mercedes

Но это определенно не лучший способ. Методы были переписаны, и они все еще наследуют Мао.

5. Решение 2. измените ключевое слово self на статическое

class Car{
 public function model(){
  //Here we use the keyword static
  static::getModel();
 }
 protected function getModel(){
  echo 'I am car';
 }
}

Мы просто заменили self в классе автомобилей на static и не изменили класс Mercedes.

В это время мы называем:

$mercedes = new Mercedes();
$Mercedes - > model(); // output: I am Mercedes

6, краткое изложение

В php 5.3 добавлена новая функция, называемая Задержка статической привязки 。 Может помочь нам достичь полиморфного

Проще говоря, Задержка статической привязки означает, что когда мы вызываем унаследованный метод с использованием ключевого слова static, он свяжет вызывающий класс во время выполнения

Для получения дополнительной информации о PHP, пожалуйста, ознакомьтесь со следующими разделами: Введение в объектно-ориентированное программирование PHP, навыки работы с массивами PHP, введение в базовый синтаксис PHP, краткое описание операций PHP и использования операторов, краткое описание использования строк PHP, введение в работу с базой данных PHP + MySQL и общие навыки работы с базой данных PHP

Я надеюсь, что эта статья будет полезна для программирования на PHP.