質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

3873閲覧

php, require_once のパス

nekoyama7

総合スコア200

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2019/09/08 13:02

__イタリックテキスト__こんにちは。

require_once("../../ファイル名.php");
require_once("../library_01/ファイル名.php");
などのパスの質問です。

/Applications/MAMP/htdocs/lib/util.php
このファイルに、勉強中の本のユーザー定義関数が入っています。
ライブラリー/ユーティリティ---という形です

/Applications/MAMP/htdocs/ckenSample.php
このファイルの中で
require_once("lib/util.php");
とすると、util.php が読み込まれ、ユーザ定義関数を問題なく実行できました。

ここで、ckenSample.php を別の階層に移したいのですが、require_once のパスの書き方がわからないのです。

一つ下の階層、たとえば、aaa フォルダーが間に入って、
/Applications/MAMP/htdocs/aaa/ckenSample.php
の場合、
require_once("../lib/util.php");
なのでしょうか?

他のファイルで、テストしたのですが、うまく行きませんでした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

__DIR__を使うとやりやすいと思います。

aaa/test.php bbb/hoge.php

hoge.phpからtest.phpをrequire

php

1require_once(__DIR__."/../aaa/test.php");

自動的に定義される定数

DIR そのファイルの存在するディレクトリ。include の中で使用すると、 インクルードされるファイルの存在するディレクトリを返します。 つまり、これは dirname(FILE) と同じ意味です。 ルートディレクトリである場合を除き、ディレクトリ名の末尾にスラッシュはつきません。

ただ、namespaceをきちんとつけたうえでcomposer利用したほうが管理面では良いかなと思います。

投稿2019/09/09 00:09

m.ts10806

総合スコア80850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nekoyama7

2019/09/09 01:01

回答ありがとうございます。composer は、ファイルの依存の複雑さを解決するために、便利なようですね。まだ、インストールしたことありません。 require_once(__DIR__."/../aaa/test.php"); の __DIR__. のピリオド(ドット)の後ろに "(ダブルクオート)が来るわけですね。単なる文字ではなく、定数として。 テストして、結果を報告します。
m.ts10806

2019/09/09 01:03

>__DIR__. のピリオド(ドット)の後ろに "(ダブルクオート)が来るわけですね。単なる文字ではなく、定数として。 定数も保持しているのは単なる文字列です。(それは変数も同じ)
nekoyama7

2019/09/09 05:31

var_dump(__DIR__); で、テストしたところ /--(ルートディレクトリ)から始まる、絶対パスが表示されました。 ピリオドの前に絶対パスがあって、その後ろのパスとの関係がよくわからないのですが? UNIX の本では、../ は、1個上の階層だったと思うのですが、意味がよくわかりません。
m.ts10806

2019/09/09 05:36

回答に書いた通りですが、__DIR__は「実行したファイルが所属するディレクトリまでの絶対パス」が返ってきます。 「相対パス風の絶対パス」の書き方が可能となります。 なので、回答に書いた書き方で bbb/hoge.phpからaaa/test.phpが参照可能になります。 require_once(__DIR__."/../aaa/test.php"); /Applications/~~のように書いてしまうと環境依存になるので他の環境では動かなくなります。 こういった定数を使ったほうがどこでも動くので、推奨です。
nekoyama7

2019/09/10 01:05

テストしてみたのですが、うまく行きませんでした。 環境依存にならないパスの指定の方が、良いとおもいますが、 require_once("/Applications/~~"); の絶対パスで、読み込めますので、当面、こちらの方法でいきます。 大変、ありがとうございました。
m.ts10806

2019/09/10 01:07

そこで「うまくいきませんでした」のまま終わっていると結局、環境依存で実際には使えないコードを使い続けることになるので何のためにもならないと思います。
m.ts10806

2019/09/10 01:09

なぜならいずれcomposerにするのであれば必ずcomposerのautoload.phpを__DIR__などを使って読み込ませる必要があるからです。きちんと組み込めば1か所だけの記述で済みますけどね。
nekoyama7

2019/09/10 23:12

貴重なアドバイス、ありがとうございます。composer のことを考え、検討します。
nekoyama7

2019/09/11 03:42

文字列の連結のピリオドの前後のスペースを入れて var_dump(__DIR__ . "/../aaa/test.php"); で実験してみます。今、出先なので。 上記の var_dump で、まず、パスを表示します。
nekoyama7

2019/09/12 10:16

呼ぶ側のファイルのパス /Applications/MAMP/htdocs/aaa777/ckenSample_DIR_Ze_Pa.php この中に以下の記述をしました。 require_once(__DIR__ . "/../lib/util.php"); -------- 呼ばれるファイルのパス /Applications/MAMP/htdocs/lib/util.php ------- 読み込みに成功しました。呼ばれた util.php の中の自作関数を使用することができました。 呼ぶ側、呼ばれる側の "/../lib/util.php" という相対的な位置が変わらなければ、別のアプリケーションに、そのまま移植できるんですね。 Composer をインストールしたとき、役に立つとおもいます。 ありがとうございました。
guest

0

ベストアンサー

相対パスは、それを記述したファイルが起点でなくて、カレントディレクトリが起点です。
なので、
カレントディレクトリが/Applications/MAMP/htdocs/aaa/であれば、それで合っています。
ウェブサーバー経由で、http://~~/aaa/ckenSample.phpを参照したなら、カレントディレクトリは/Applications/MAMP/htdocs/aaa/になっているはずです。

それ以外の方法で実行した場合は、カレントディレクトリが/Applications/MAMP/htdocs/aaa/とは限らないです。

ライブラリファイルなら、絶対パス指定がいいのでは?

投稿2019/09/08 14:00

編集2019/09/08 22:02
otn

総合スコア84557

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nekoyama7

2019/09/09 01:07

回答ありがとうございます。なるほど、絶対パスにすれば、どの階層からrequire_once をしても、同じ記述ですね。 require_once("/Applications/MAMP/htdocs/lib/util.php"); と絶対パスで実験してみます。
nekoyama7

2019/09/09 02:36

ドキュメントルートの、すぐ下にあるファイル /Applications/MAMP/htdocs/ckenSample_Zetta_Pa.php ドキュメントルートの下の、 aaa フォルダーの下にあるファイル /Applications/MAMP/htdocs/aaa/ckenSample_Zetta_Pa.php 両方から、絶対パスの require_once("/Applications/MAMP/htdocs/lib/util.php"); での読み込みに成功しました。この中の関数を使うことができました。 大変、ありがとうございました。
guest

0

phpの振る舞いを定義する php.ini ってのがあって、
そこに記述される include_path に
ライブラリなどの置き場所を定義したらラクなんじゃないかと。

include_path

include_pathを変更できないのであれば、
ライブラリまでの絶対パスをrequire類を記述するたびに書くか、
ライブラリまでの相対パスをrequire類を記述するたびに書くって話になりそう。
(そのへんについては他の方の回答で説明があるので省く。)

投稿2019/09/09 02:47

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nekoyama7

2019/09/09 04:35

解答ありがとうございます。php.ini の設定は、日本時間の設定などで、経験があります。Composer インストールしたことないのですが、web で調べただけですが、ライブラリファイルが多くなり、依存関係が複雑になるとき、重宝するようなので、いずれは、Composer が良いかなと思っています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問