Магические методы

ООП. Практическая реализация

Маст-хэв тулз [must-have tools]

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

Var_dump(ОБЪЕКТ);

В качестве примера возьмём код, опубликованный в предыдущем файле, посвященном ООП:

class Config {

private $config = array();

public function __construct() {

$this->config[ 'database' ][ 'username' ] = 'root';

$this->config[ 'database' ][ 'password' ] = 'test';

}

public function getBranch($branch) {

if(array_key_exists($branch, $this->config))

return $this->config[ $branch ];

return false;

}

}

class Database {

public function connect() {

$config = Core::getClass('config')->getBranch('database');

// Действия

}

}

class Core {

private static $classContainer = array();

public static function getClass($name) {

$name = strtolower($name);

return (

array_key_exists($name, self::$classContainer)?

self::$classContainer[ $name ]:

false

);

}

private static function loadClass($className) {

if(class_exists($className) &&

!array_key_exists(strtolower($className), self::$classContainer)

) {

self::$classContainer[ strtolower($className) ] = new $className();

}

}

public static function run() {

self::loadClass('config');

self::loadClass('database');

self::getClass('database')->connect();

}

}

Core::run();

Теперь допишем следующие строки:

var_dump(Core::getClass('database'));

Запустим наш скрипт. На экране вы увидите:

object(Database)#2 (0) { }

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

var_dump(Core::getClass('config'));

Результат выполнения:

object(Config)#1 (1) { ["config":"Config":private]=> array(1) { ["database"]=> array(2) { ["username"]=> string(4) "root" ["password"]=> string(4) "test" } } }

Да-да, вы всё правильно поняли. Функция var_dump обладает абсолютной властью над любыми объектами и типами данных, поскольку предназначена специально для отладки. При её использовании вы увидите все переменные экземпляра класса, даже если они приватные или ограниченные (private или protected).

Магические методы

Магические методы тоже нужны, в основном, для отладки.

__CLASS__

В данной магической перменной находится имя класса (в случае, если класс импортирует какие-то другие классы, в этой переменной всё равно окажется только имя того класса, где эта магическая переменная используется). Пример:

Код:

class A {

public function getClass() {

print __CLASS__. '<br />';

}

}

class B extends A {

public function getClass2() {

print __CLASS__. '<br />';

}

}

$b = new B();

$b->getClass();

$b->getClass2();

Результат:

A
B

Таким образом, мы получили имя класса, где эта переменная используется.

__FUNCTION__

Как понятно из названия переменной, она имеет какое-то отношение к функциям. А если говорить конкретнее, то эта магическая переменная содержит имя функции, в которой эта переменная используется.

Пример:

Код:

class A {

public function getClass() {

print __FUNCTION__. '<br />';

}

}

class B extends A {

public function getClass2() {

print __FUNCTION__. '<br />';

}

}

$b = new B();

$b->getClass();

$b->getClass2();

Результат:

getClass
getClass2

__METHOD__

А это магическая переменная не только укажет нам на название функции, но и её принадлежность к конкретному классу. Часто используется при отладке приложений.

Пример:

Код:

class A {

public function getClass() {

print __METHOD__. '<br />';

}

}

class B extends A {

public function getClass2() {

print __METHOD__. '<br />';

}

}

$b = new B();

$b->getClass();

$b->getClass2();

Результат:

A::getClass
B::getClass2


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: