PHP. Получить namespace дочернего класса используя метод родительского класса
Данный материал предоставлен сайтом
PacificSky.Ru исключительно в ознакомительных целях. Администрация не несет ответственности за его содержимое.
Представим ситуацию, что мы создаем экземпляр дочернего класса, который унаследован от родительского. Обращаемся к методу дочернего класса, который на самом деле унаследован от родительского класса. И этот метод должен возвращать пространство имен (namespace) дочернего класса.
Рассмотрим задачу подробнее:
Код файла Start.php и содержащегося в нем дочернего класса Start:
Как видите в дочернем классе у нас вообще нет методов. Но 1 метод (index) унаследован от родительского класса.
Код файла ParentStart.php и содержащийся код родительского класса:
Теперь, создав и обратившись к экземпляру класса Start мы можем вызвать метод (index), содержащийся в родительском классе.
На данный момент этот код нам ничего не вернет, так как тело метода родительского класса пустует.
Определимся, что данный метод должен вернуть нам строку пространства имен дочернего класса.
Возможно кто то скажет, ну что тут может быть сложного. Нужно написать что-то вроде этого и все будет круто:
Но данный код вернет строку пути до пространства имен родительского класса, а не дочернего.
Будет возвращена строка:
Был найден следующий вариант решения проблемы:
Был получен путь вызванного класса и из данного пути убрано название данного класса.
Итого код приобретает следующий вид:
Будет возвращена строка дочернего класса:
Та строка, которая нам и была нужна.
Выполняем проверку:
В результате будет возвращена строка, содержащая пространство имен дочернего класса:
Рассмотрим задачу подробнее:
Код файла 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
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.