2011-11-17 40 views
0

マイファイル構造:私はHTMLの<head>一部を生成するための一般的な機能を持っているfunctions.phpファイル構成

/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/ 

。また、文書ルートから絶対パスを返す関数。 /holiday/includes/を計算しようとしました。

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

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

私はここに同じことを達成するために、より簡単な方法がなければならないように感じる:

<? 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は、この方法が含まれます。私のget_path()用の組み込みPHP関数?たぶん私は自分の問題に別の方法で接近すべきでしょうか?

注: 一部の人々はフレームワークを使用することを推奨しています(これは良いことです)。しかし、私(そして他の人たち)がインクルードファイルの全体を理解するのを助けるために、他の非フレームワークの説明がありますか?

関連ディスカッション:あなたが現在持っているレイアウトのタイプでは

+2

フレームワークを考えると、一般的に言えば、非常に簡単な環境の中でこのようなことを処理する強く成熟したフレームワークがたくさんあります。 – DeaconDesperado

+0

補足として、ショートタグPHP表記を取り除くべきでしょう。つまり、 '<?'から '<?php'に変更してください。ショートタグは推奨されなくなりました。 –

+0

@DeaconDesperado:これはおそらくdevとdevの違いですが、これを行う軽量フレームワークの推奨がありますか? – moey

答えて

0

、私は一定のトリックを行います使用して見つける:

# 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/の場合、1つの定数、つまりPREFIXを変更するだけで済みます。

+0

heredocの中で定数を使う必要がある場合、この議論はあなたに答えを与えるべきです:http://stackoverflow.com/q/8242922/583539。 – moey

0

、あなたの最善の策はのすべてを保持している単一includes.phpファイルを持っていることですrequire_onceがコールされたら、入力スクリプトの先頭にrequire_once('../includes.php')(または同等の場所)を使用します。セットアップとメンテナンスには苦労しますが、少なくとも1か所にあります。

関数の代わりにオブジェクトを使用する予定の場合は、__autoload()を使用します。

+0

あなたが必要としているのは 'functions.php'だったのかどうかは不明ですが、その場合は' __autoload() '構造に移動しないと本当に良い解決策はありません。 – hafichuk

+0

ありがとう、@hafichukこの時点では、含めるファイルは1つだけです。これは 'functions.php'です。まもなく、もっと確実になるでしょう。 '__autoload()'が1つのインクルードファイルがあるときだけうまく動作するように提案していますか? – moey

1

@ Siku-Siku.Com、__autoload()を使った自動読み込みクラスは、あなたの主な問題を本当に助けません。また、主にオブジェクト指向設計に移行すれば、__autoload()を最大限に活用することができます。これにより、独自の課題が発生します。

現在、最も賢明なことは@hafichukが示唆しているとおりです。 1つのmainファイルにmy_funcs.inc.phpというファイルをインクルードし、それを他のすべてのページの先頭に含めます。利点は、インクルードファイルに特別な.inc拡張を付けることにより、それらをより簡単に区別できることです。また、これを使用して、Apacheでこれらのファイルをブロックすることもできます。

もしかして:
1)私は短いタグが危険だと思う。彼らは悪いコーディング方法を奨励し、悪夢を移植するためにドアを広く開いたままにします。そして彼らは悪いコーディング慣行を奨励します。
2)のステートメント、関数ではなく、それは次のように使用しなければならない必要があるので:これでより多くの実験や他の入力を収集した後

require 'my_file.inc.php'; 
+0

+1の '.inc'提案です。あなたが指摘したように、PHPのドキュメントでは、関数として扱われていますが、通常は 'require'には'() 'が続かないことがわかりました:http://php.net/manual/en/function.require PHP(URLに気づく)。 – moey