PHP. Получить namespace дочернего класса используя метод родительского класса

Представим ситуацию, что мы создаем экземпляр дочернего класса, который унаследован от родительского. Обращаемся к методу дочернего класса, который на самом деле унаследован от родительского класса. И этот метод должен возвращать пространство имен (namespace) дочернего класса.
PHP. Получить namespace дочернего класса используя метод родительского класса


Рассмотрим задачу подробнее:
Код файла Start.php и содержащегося в нем дочернего класса Start:
<?php namespace app\Components\Registration;

class Start extends \app\Components\ParentStart {}


Как видите в дочернем классе у нас вообще нет методов. Но 1 метод (index) унаследован от родительского класса.

Код файла ParentStart.php и содержащийся код родительского класса:
<?php namespace app\Components;

abstract class ParentStart
{
    public function index() {

    }
}


Теперь, создав и обратившись к экземпляру класса Start мы можем вызвать метод (index), содержащийся в родительском классе.

$start = new Start();

$start->index();


На данный момент этот код нам ничего не вернет, так как тело метода родительского класса пустует.

Определимся, что данный метод должен вернуть нам строку пространства имен дочернего класса.
Возможно кто то скажет, ну что тут может быть сложного. Нужно написать что-то вроде этого и все будет круто:
<?php namespace app\Components;

abstract class ParentStart
{
    public function index() {
        return (string)__NAMESPACE__;
    }
}


Но данный код вернет строку пути до пространства имен родительского класса, а не дочернего.
Будет возвращена строка:
app\Components


Был найден следующий вариант решения проблемы:
Был получен путь вызванного класса и из данного пути убрано название данного класса.
substr(get_called_class(), 0, strrpos(get_called_class(), "\\"))


Итого код приобретает следующий вид:
<?php namespace app\Components;

abstract class ParentStart
{
    public function index() {
        return (string)substr(get_called_class(), 0, strrpos(get_called_class(), "\\"));
    }
}


Будет возвращена строка дочернего класса:
Та строка, которая нам и была нужна.
app\Components\News


Выполняем проверку:

$start = new Start();

var_dump($start->index());


В результате будет возвращена строка, содержащая пространство имен дочернего класса:
app\Components\News
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.
  • Яндекс.Метрика
  • Счетчик PR-CY.Rank
  • Рейтинг@Mail.ru