Вызов функции выхода из дочернего класса в переполнении стека

У меня есть класс PHP, где я должен вызывать PHP header функция для отображения веб-страницы. Как указано из эта почта, заголовок должен сопровождаться exit Перезвоните. Так как эта ситуация очень распространена в моих классах, я определил метод в родительском классе:

class ParentClass
{
protected function header($url)
{
header('Location:'.$url);
exit;
}
}

Я хотел бы вызвать этот метод из дочерних классов:

class ChildClass extends ParentClass
{
public function someFunc()
{
$this->header($some_url);
}
}

PHP документация Говорит, что exit завершает текущий скрипт. Мой вопрос: завершает ли функция выхода дочерний скрипт, даже если он содержится в родительском классе?

РЕДАКТИРОВАТЬ

В моей конкретной ситуации я использую шаблон проектирования MVC и ChildClass это контроллер. Внутри него иногда мне нужно показать представление, иногда мне нужно перенаправить на другой URL. Позвольте мне объяснить это на практическом примере.

Предположим, у вас есть веб-сайт с разделом для входа. Когда страница входа отображается для пользователей (данные входа не представлены), контроллер входа должен отображать вид входа. Это представление содержит форму с действием action="login.html", Когда данные отправлены, контроллер входа в систему вызывается и проверяет данные входа в систему: если вход в систему успешен, пользователь перенаправляется в его раздел администратора.

class UsersController extends BaseController
{
public function login()
{
try
{
if(isset($_POST['submit']))
{
// check login data, throw exception in case of error

// if success, redirect to admin section
$this->header('admin.html');
}else
{
// show login view
}
}

catch(Exception $e)
{
// show login view (with error)
}
}
}class BaseController
{
protected function header($url)
{
header('Location:'.$url);
exit;
}
}

Так как эта ситуация довольно распространена в моих контроллерах, я предпочел определить header метод в BaseController вместо того, чтобы печатать каждый раз

header('Location:someURL.html');
exit;

В моем ОП я только хотел быть уверен, что $this->header('admin.html'); обратный вызов прервет текущий login метод, даже если он определен в BaseController скрипт.

Надеюсь, теперь стало немного понятнее.

-1

Решение

Как уже описано в комментарии, выход завершит все, то есть веб-страница немедленно прекратит выполнение, включая функции очистки и, наконец, блоки.
Таким образом, вы должны рассмотреть возможность использования exit очень осторожно, потому что может произойти много вещей: данные не записываются в базу данных, когда вы не используете автоматическую фиксацию (если вы не зафиксировали данные перед вызовом exit). Автоматическая фиксация по умолчанию не включена в PHP-модуле MySQL (насколько я знаю).

Вот пример:

class B extends A {
public function someFunc() {
# you might wanna use partent instead as
# pointed out by Ding in the comments, but
# maybe someFunc does more that just doing
# the redirect.

$this->header("http://google.com");
}
}

try {
print("Ok...");
$obj = new B();
$obj->someFunc();
print("Nahh...");  # doesn't get called/
} finally {
print("Cleaning up.");  # doesn't get called, either.
}

Вместо того, чтобы вызывать метод выхода, вы должны реализовать MVC шаблон дизайна. Вот очень быстрый пример:

<?php
class Response {
# use private here and use appropriate
# getters and setters.
public $status_code = 200;
public $content = "";
public $headers = array();
}

class HomeView extends View {
# called when a get request is made.
public function get() {
$response = new Response();
$response->content = "Hello world."}
}

class RedirectionView {
public function get() {
$response = new Response();
$response->status_code = 301;  # use 302 if moved only temporarily.
$response->headers["Location"] = "http://google.com";
}
}

function processRequest() {
# load appropriate view programatically
$view = new RedirectionView();
$response = $view->get();
http_response_code($response->status_code);
foreach ($response->headers as $headerName => $headerValue) {
header(sprintf("%s: %s", $headerName, $headerValue));
}
print($view->content)
}
?>

Обратите внимание, что на самом деле это не шаблон проектирования MVC (модель отсутствует и, ну, не совсем понятно, что контролер, однако, это то, что тоже использует django (среда Pyhton)). Возможно, вы захотите проверить фреймворки PHP MVC (быстрый поиск в Google поможет) или реализовать свою собственную (мой пример может быть хорошим началом).

Изменить 1:
С помощью exit вероятно, хорошо (но я бы не использовал его, потому что я считаю, что это плохая практика). Если вам удастся отредактировать используемый вами подход к проектированию, я бы назначил ваш метод get / post для View BaseClass (или любой другой метод, который возвращает объект ответа. Примечание: если вы используете распечатки для отображения ответ пользователю, попробуйте добавить ответ, который содержит все данные, которые необходимо запросить. Это лучше, чем иметь printс (или echos) везде в вашем коде).
Используя объект ответа, ваш код сможет установить заголовок местоположения (если он перенаправлен) или показать сообщение. Таким образом, вам не нужно «убивать» какую-либо часть веб-страницы, и она закончится, когда закончится выполнение. Но опять же: вы, вероятно, хорошо идти с exit вызовите ваш метод (если вы не столкнулись с какими-либо проблемами с вашим кодом (транзакции базы данных, которые не зафиксированы, статистические данные не обновляются (потому что после exit заявление). Exit просто завершит ваш скрипт полностью.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]