2014-02-14 3 views
0

Я использую include(); для загрузки определенных частей моей страницы, но иногда, если я работаю в определенной области, я хочу, чтобы функция include(); прекращалась где-то внутри этого включенного файла, поэтому я использую return;, и все, что после этой строки не будет быть включенным, когда в этот файл вызывается include();. Я не могу использовать die();, потому что иногда у меня есть другие файлы, которые необходимо включить.Функция использования PHP как возвращение ;?

Теперь я хочу иметь возможность контролировать функцию return; с точки зрения того, что другие пользователи видят, например, - я хотел бы ограничить, какие типы пользователей могут видеть за пределами этой строки return; внутри включенного файла. Я хочу, чтобы пользователи уровня администратора могли видеть за пределами этого момента, но не обычные пользователи. Поэтому я использую какой-то оператор if() { }, чтобы проверить тип пользователя. Иногда я хочу, чтобы только я мог просматривать содержимое после строки return;, а затем добавляю if($ip != $my_ip) return;.

Проблема в том, что мне приходится вручную писать этот материал, но поскольку я часто использую его, я бы хотел написать функцию, которую я могу передать тем пользователям, которых я хочу, чтобы обойти часть return;. Так что я настроить terminate(); функции, что-то вроде этого:

function terminate($param) { 
    // if statement 
    { 
     return; 
    } 
} 

Но return; строки в этой функции возвращает только в этой функции, она не оказывает никакого влияния на файл, который называется этой функцией. То есть, другими словами, линия return; в моей функции terminate(); фактически не будет делать return; Мне нужно остановить функцию include();, выходящую за ее пределы.

Так как же я остановить include(); команду на моем файле происходит после определенной точки с функции и не прерывать оставшийся код после остановки include();?

Edit: как темп исправить, я использую это:

if(terminate($param)) return; 

Таким образом, после прохождения моих параметров функции, если она возвращает true (остановить include();), он будет return; на файл Я в том числе. Так это работает именно так, я просто интересно, если это возможно, чтобы просто иметь terminate($param); команду, которая будет срабатывать команду return; на файл, который называется эту функцию без необходимости, чтобы обернуть его вокруг в if() заявление? ..

+0

'включают 'является операцией. Для меня это должно быть атомарным - то есть как любая другая операция, это может только потерпеть неудачу или успех. И успех означает «полностью включено». Средний случай кажется нечетным в лучшем случае, это похоже на «возможно, он был включен» или «он был включен, но мы не знаем, как это было полностью» (и для внешнего условия сценария для «может быть» полностью черный ящик). Так зачем вам такое поведение? –

+0

Aaah. Понимаю. Тогда я не могу представить другого способа, кроме тестирования. Вы можете написать много функций, которые проверяют userTypes, Ip и т. Д., Которые возвращают логическое значение. 'if (myFuncForUserTypes ($ user_id)) {// включен контент}' –

+0

Моя цель - остановить 'include();' ** в ** этом файле, а не на том, чтобы я хотел включить этот файл. Он работает с 'return;', но это утомительные условия записи каждый раз, когда я хочу завершить работу над определенной частью этого файла include, было бы намного проще с помощью функции. Кроме того, обтекание содержимого 'if()' блокирует каждый раз, также утомительно. Я ищу способ получить строку 'return;' внутри функции initiate, которая 'return;' в файле, который вызвал функцию, а не он возвращает только ** внутри **, которая называется функцией. – Matt

ответ

0

В целом, большинство современных проектов, которые пытаются использовать чистые шаблоны только с HTML, которые подчиняются архитектуре MVC и т. Д., Используют условия в своих шаблонах. В этом нет ничего плохого. Если вы используете шаблон, он выглядит чистым.

<div class="content"> 
    <span class="subcontent"> some content </span> 
    <?php if ($app->UserController->hasPermissions($_SESSION['id'])): ?> 
     <span class="admincontent"> Admin Content </span> 
    <?php endif; ?> 
</div> 

Этот вид кода считается ОК. У вашего представления есть условия и циклы. Вы не можете их избежать. Также он не выглядит таким чистым, если у вас есть

<div class="content"> 
    <span class="subcontent"> some content </span> 
    someFunction(); 
     <span class="admincontent"> Admin Content </span> 
</div> 

Которая также спрячет весь контент до конца файла. И с этим трудно справиться. Это еще не невозможно.Вы можете использовать буфер вывода для этого:

Допустим, у вас есть:

functions.php

<?php session_start(); $_SESSION['user_id'] = 1; //fictive session code ?> 
<?php 
function hasPermissions() { 
    if ($_SESSION['user_id'] != 1) { 
     ob_end_clean(); 
    } 
} 
?> 
<?php ob_start(); ?> 

end.php

<?php $ob = ob_get_contents();?> 
<?php ob_end_clean(); ?> 
<?= $ob; ?> 

template.php

<?php include("functions.php"); ?> 

<p>included content</p> 
<?php hasPermissions(); ?> 
<p> included content 2 </p> 

<?php include("end.php"); ?> 

так, если вы с идентификатором сессии = 1, и работает template.php файл, то выход будет:

included content 

included content 2 

Else он будет выводить

included content 
Смежные вопросы