Файловая структура для проекта PHP - PullRequest
0 голосов
/ 17 ноября 2011

Моя файловая структура:

/holiday/admin/list.php
/holiday/includes/functions.php   # common functions
/holiday/index.php

# / is the document root
# /holiday/ is a "self-contained" sub-directory
# There are other "self-contained" sub-directories e.g. /promotion/, /international/

В functions.php У меня есть общая функция для генерации <head> части HTML;также, функция для возврата абсолютного пути от корня документа. Примечание моя попытка расчета /holiday/includes/.

<? function get_path() {
  // Technically, this returns dirname(__FILE__) - $_SERVER['DOCUMENT_ROOT']
  return str_replace($_SERVER['DOCUMENT_ROOT'], "", dirname(__FILE__)); 
} ?>

<? function open_page($head = "", $body_id = "") { ?>
<!DOCTYPE HTML>
<html>
<head>
<link type="text/css" rel="stylesheet" href="<? echo get_path() . "/../css/savvyextras.css"; ?>" />
<script type="text/javascript" src="<? echo get_path() . "/../scripts/modernizr.js"; ?>"></script>
...
<? } ?>

functions.php включена следующим образом:

// From list.php
require_once('../includes/functions.php');
open_page(...);

// From index.php
require_once('./includes/functions.php');
open_page(...);

Я чувствую, что должно быть более простымподход, чтобы выполнить то же самое здесь.Любая встроенная функция PHP для моего get_path()?Может быть, я должен подойти к моей проблеме по-другому?

Примечание: Некоторые люди предложили использовать фреймворк (что хорошо).Но, чтобы помочь мне (и другим) понять всю эту вещь включенного файла, другие не-каркасные объяснения?

Похожие обсуждения :

Ответы [ 3 ]

1 голос
/ 19 ноября 2011

@Siku-Siku.Com, автоматическая загрузка классов с помощью __autoload () не поможет решить вашу главную проблему. Кроме того, вы сможете получить максимальную отдачу от __autoload (), если перейдете к преимущественно объектно-ориентированному дизайну, который принесет свои проблемы.

В настоящее время самое разумное, что предлагает @hafichuk. Создайте один основной включаемый файл, скажем, my_funcs.inc.php, и включите его в начало каждой другой имеющейся у вас страницы. Преимущество заключается в том, что, предоставляя специальные расширения .inc для ваших включаемых файлов, вы сможете легче их различать. Кроме того, вы можете использовать это, чтобы заблокировать эти файлы в Apache для дополнительной защиты.

Если бы я мог также упомянуть:
1) Я думаю, что короткие теги опасны. Они поощряют плохую практику кодирования и оставляют дверь широко открытой для переноса ночных кошмаров. И они поощряют плохую практику кодирования.
2) Поскольку require - это оператор, а не функция, его следует использовать следующим образом:

require 'my_file.inc.php';
0 голосов
/ 23 ноября 2011

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

# functions.php

define('PREFIX', '/holiday');

<? function open_page($head = "", $body_id = "") { ?>
<!DOCTYPE HTML>
<html>
<head>
<link type="text/css" rel="stylesheet" href="<?php echo PREFIX; ?>/css/savvyextras.css"; ?>" />
<script type="text/javascript" src="<?php echo PREFIX; ?>/scripts/modernizr.js"; ?>"></script>
...
<? } ?>

Итак, если вам нужно переместить /holiday/ в другой подкаталог, например, /vacation/, вам просто нужно изменить одну константу, т.е. PREFIX.

0 голосов
/ 17 ноября 2011

С типом макета, который у вас есть в данный момент, лучше всего иметь один includes.php файл, содержащий все ваши require_once вызовы, а затем использовать require_once('../includes.php') (или эквивалентное местоположение) вверху каждого из ваших входных скриптов. Это сложно настроить и поддерживать, но, по крайней мере, все это в одном месте.

Если вы планируете перейти к использованию объектов вместо функций, то я бы взглянул на использование __autoload().

...