Самоиндефикация объекта при помощи предопределённой константы в PHP
Вход Регистрация

Самоиндефикация объекта при помощи предопределённой константы в PHP

Классы, наряду с членами, могут содержать константы, которые определяются при помощи специального слова const. К константам, как и к статическим членам класса, нельзя обратиться через оператор "->", для обращения к ним также используется оператор видимости "::", который представляется либо с именем класса, либо с ключевыми словами "parent::" и "self::".

Приведём пример:


class MyNewConst {

	const NEWCONST = 'MyConst';

	public static function test() {

		// echo $this->NEWCONST; // Вызовет ошибку при обращении

		echo self::NEWCONST;

		echo MyNewConst::NEWCONST;

	}

}


class NewExtends extends MyNewConst {

	public static function Newtest() {

		echo parent::NEWCONST; // Перегружаем константу, класса "MyNewConst"

		echo parent::test(); // Перегружаем метод, класса "MyNewConst"

	}

}

echo MyNewConst::NEWCONST .'<br>'; # Константы имеют доступ "public", тоесть они видны как в самом классе так и извне;

MyNewConst::test();
NewExtends::Newtest();

Хоть и строгих правил именования констант нет, но для этого обычно используют символы в вернем регистре.Лучше придерживаться данных традиций, так как это позволит сделать код программы более читабельным. При помощи функции "define()", можно определить обычную пользовательскую константу, а при помощи функции "defined()" проверить её существование. Функция "defined()" возвратит "true" в том случае если константа существует и "false" в противном случае. При проверке классовых констант следует в обязательном порядке использовать оператор расширения области "::" и имя класса.

Пример:


// Условие выполнится
if(defined("MyNewConst::NEWCONST")) {

	echo 'Константа определена';

} else {

	echo 'Константа не определена';

}

// Условие не выполнится
if(defined("MyNewConst::NEWCONST2")) {

	echo 'Константа определена';

} else {

	echo 'Константа не определена';

}

Кроме констант которые может создавать в классе разработчик, существуют предопределённые константы, которые определяет интерпретатор - PHP.

Список предопределённых констант:

  • "__LINE__" - Номер строки в файле скрипта.
  • "__FILE__" - Полный путь к файлу.
  • "__FUNCTION__" - Имя функции, из которой вызывается константа.
  • "__CLASS__" - Имя класса.
  • "__METHOD__" - Имя метода класса (данная константа введена в 5 версию PHP).

Основное назначение предопределённых констант заключается в том что они дают возможность определить с точностью место возникновения ошибки. Приведём пример использования предопределённых констант для идентификации номера строки, имени функции и полного пути файла.


function test() {

	return 'Вызвана функция: '. __FUNCTION__ .' | Путь файла: '. __FILE__ .' | Строка: '. __LINE__;

}

Результат покажет:


Вызвана функция: test

Путь файла: /var/www/php.php

Строка: 6

Константа "__LINE__" подставляет номер строки вызова константы, а не функции, откуда она вызывается. Точно также действуют и остальные константы. Как видно из примера выше константы "__LINE__", "__FILE__" и "__FUNCTION__" не связаны непосредственно с объектно - ориентированным подходом. Однако не что не мешает их использовать в классах.

Пример:


class predefined {

	public static function test() {
		return 'Вызвана функция: '. __FUNCTION__ .' | Путь файла: '. __FILE__ .' | Строка: '. __LINE__;
	}

}

echo predefined::test();

Результат покажет:


Вызвана функция: test

Путь файла: /var/www/php.php

Строка: 8

А так же в класса предусмотрены специализированные константы: "__CLASS__" и "__METHOD__".


class predefined {

	public static function test() {
		return 'Вызван метод: '. __METHOD__ .' | Класс: '. __CLASS__;
	}

}

echo predefined::test();
Результат покажет:


Вызван метод: predefined::test

Класс: predefined

С помощью предопределённой константы "__CLASS__" можно реализовать метод самоидентификации объектов. Представим что у нас имеется класс состоящий из базового класса "MyBase", производного класса "MyDerivative" и не зависящий от них класс "NewClass". Классы "MyBase" и "NewClass" содержат метод "mytest()", который возвратит имя класса при помощи предопределённой константы "__CLASS__". Классу "MyDerivative" метод "mytest()" передаётся по наследству.

Пример:


// Базовый класс
class MyBase {

	public function mytest() {
		return __CLASS__;
	}

}


// Производный класс
class MyDerivative extends MyBase {}


// Не зависящий класс
class NewClass {

	public function mytest() {
		return __CLASS__;
	}

}

$New_Class = new MyBase();
echo $New_Class->mytest();

$New_Class = new MyDerivative();
echo $New_Class->mytest();

$New_Class = new NewClass();
echo $New_Class->mytest();

Результат покажет:


MyBase

MyBase

NewClass

Как видно из результата, константа "__CLASS__" возвращает имя класса, в котором она вызывается. Метод "mytest()" в классе "MyDerivative" вызывается в контексте класса "MyBase", поэтому предопределённая константа "__CLASS__" возвращает имя базового класса. Для того чтобы исправить данную ситуацию, потребуется переопределить метод "mytest()" в классе "MyDerivative", полностью воспроизведя его содержимое из класса "MyBase".

Пример:


// Базовый класс
class MyBase {

	public function mytest() {
		return __CLASS__;
	}

}


// Производный класс
class MyDerivative extends MyBase {

	public function mytest() {
		return __CLASS__;
	}

}

$New_Class = new MyBase();
echo $New_Class->mytest();

$New_Class = new MyDerivative();
echo $New_Class->mytest();

Результатом будет "MyBase" и "MyDerivative", так как мы переопределили метод в классе "MyDerivative".


Комментировать

captcha

Вход

Зарегистрируйтесь, если нет учетной записи

Напомнить пароль
Регистрация
Напомнить пароль
Войти в личный кабинет