0

私はこれを自分で行う方法を探していて、この方法を思いついた:

<?php
$script_name = $_SERVER['SCRIPT_NAME']; // to get www.myurl.com

// create a constant out of the server_name
define('HTTP_HOST', $_SERVER['HTTP_HOST'].'/');

$path_parts = pathinfo($script_name); // returns an array with path names

// get the filename with the extension
$file_name = $path_parts['filename'] . '.' . $path_parts['extension'];
// get the directory which the script lives in
$dir = rtrim($script_name, $file_name);
// trim of the left slash since it was added on the end of the HTTP_HOST constant
$dir = ltrim($dir, '/');
// store the server name and directory paths in a variable
$dir = HTTP_HOST.$dir;

echo $dir; // will return f.ex. "www.myurl.com/dir1/dir2/dir3/"

""のディレクトリ"dir3"の下にある"testfile.php"というファイルがあるとしましょう。www.myurl.com/dir1/dir2/dir3したがって、完全なURLは" www.myurl.com/dir1/dir2/dir3/testfile.php"になります。

パスファイルでURLと完全なディレクトリパスの定数を宣言するか、インデックスファイルのf.exに含める構成ファイルを宣言し、testfile.php内でその定数を呼び出すと、エコーが終了します。「」がエコーアウトしwww.myurl.com/dir1/dir2/dir3/ます。

私の質問は、この方法は受け入れられるのか、それとも特定のファイルへのディレクトリパスを含むURLを実現するためのより良い方法があるのか​​ということです。

ありがとうございました。

4

3 に答える 3

2

誰もが知っているように、完璧主義を達成するのは困難です。これは、多くの場合、物事を達成するためのより良い方法があることを意味します。

あなたの質問のコードを見ると、探しているものを達成するためのより良い方法があると確信しています。質問に戻ります。

私の質問は、この方法は受け入れられるか、または特定のファイルへのディレクトリ パスを使用して URL を取得するためのより良い方法があるかということです。

答えはイエスです。たとえば、より良い方法は、実装を独自のオブジェクト (ファイル マッパーなど) にカプセル化することです。これにより、時間の経過とともに変化する可能性のある最良の方法を常に利用できます。

少なくとも、ファイル名を Web ディレクトリにマップするロジックをカプセル化する関数から始める必要があります。また、いわゆる入力を利用して、コードの先頭で処理します。

function get_webdirectory_of_file($file)
{
   # input (and validation)

   $host = $_SERVER['HTTP_HOST'];
   $docroot = $_SERVER['DOCUMENT_ROOT'];

   if (!is_file($file) {
       throw new Exception('Not a file');
   }

   if (!$host) {
       throw new Exception('No HTTP_HOST found.');
   }

   if (!$docroot ) {
       throw new Exception('No DOCUMENT_ROOT found.');
   }  

   $len = strlen($docroot);

   if (substr($file, 0, $len) !== $docroot) {
       throw new Exception('Unable to map file out of document root to document root');
   }

   # processing

   $dir = substr(dirname($file), $len);

   # output 

   return $host . $dir;
}

コードは独自の関数内にあるため、アプリケーションの残りの部分 (の多く) を変更することなく、時間をかけてコードを改善できます。オブジェクトを使用すると、簡単に置き換えて全体をより柔軟にすることができるため、より優れていますが、関数から始めることも良い考えです。使用例:

 echo get_webdirectory_of_file(__FILE__);

あなたのコードを見る:

<?php
$script_name = $_SERVER['SCRIPT_NAME']; // to get www.myurl.com

$_SERVERその変数の使用に関する問題については、PHP のマニュアルを確認してください。

// create a constant out of the server_name
define('HTTP_HOST', $_SERVER['HTTP_HOST'].'/');

$_SERVER['HTTP_HOST']既に存在するため、定数を作成する必要はありません。これは、後でその定数を使用することに関連する問題を隠すだけです。コードからその定数を削除することをお勧めします。

$path_parts = pathinfo($script_name); // returns an array with path names

// get the filename with the extension
$file_name = $path_parts['filename'] . '.' . $path_parts['extension'];

実際、ここで探しているbasenameのは次のとおりです。

$file_name = basename($_SERVER['SCRIPT_NAME']);

あなたのコードを続けてください:

// get the directory which the script lives in
$dir = rtrim($script_name, $file_name);

これは少し痛いです。rtrim関数が何をするのかをもう一度読んでください。ここでは使いたくないでしょう。

// trim of the left slash since it was added on the end of the HTTP_HOST constant
$dir = ltrim($dir, '/');

このltrimようなケースでの使用は巧妙に見えるかもしれませんが、多くの場合、これは、実際に何を行っているのか、どの入力値を使用して作業しているのかを理解していない臭いです。同様に定数を使用する場合と比較してください。

// store the server name and directory paths in a variable
$dir = HTTP_HOST.$dir;

ここで変数名を再利用します ( $dir)。それは通常役に立ちません。/また、最初に上記の行を削除するためだけに追加する場合/、これは意味がありません。あなたは両方を惜しまないことができます。

echo $dir; // will return f.ex. "www.myurl.com/dir1/dir2/dir3/"

確かに、問題はあなたがそれを必要とするものとそれがどれほど安定しているかです. 書かれているように、それを行うにはもっと良い方法があると確信しています。

于 2012-05-29T13:16:21.620 に答える
0

これはうまくいくはずです:

$dir = $_SERVER['HTTP_HOST'] . substr(dirname(__FILE__), strlen($_SERVER['DOCUMENT_ROOT']));
于 2012-05-29T13:16:13.630 に答える
0

これが機能するかどうかを確認します。

function getCurrentPageURL() {
  $protocol = "http";
  if ($_SERVER["HTTPS"] == "on") {$protocol .= "s";}
  $protocol .= "://";

  $server = $_SERVER["SERVER_NAME"];

  if ($_SERVER["SERVER_PORT"] != "80") {
      $page = $server .  ":" . $_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"];
   } else {
      $page = $server . $_SERVER["REQUEST_URI"];
   }
   return $protocol . $pageURL;
}

このソリューションでは、さまざまなポートと HTTPS プロトコルが考慮されます。

于 2012-05-29T13:17:05.817 に答える