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

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

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

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

Q&A

解決済

3回答

1157閲覧

include_onceで絶対パスを指定した場合のユーザー定義関数について

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

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

0グッド

0クリップ

投稿2018/01/18 21:39

編集2018/01/18 23:11

###前提・実現したいこと
「includeは絶対パスを指定しよう」的な記事が多かったので、相対パスでやっていた部分を絶対パスに変えたところ、これまで呼び出せていたユーザー定義関数が呼び出せなくなってしまいました。
相対パスならインクルード元のindex.htmlからインクルード先のtest.php内のtestfunc()を呼び出すことが出来る(①の部分)のですが、絶対パスだと出来ません。しかし絶対パスの場合も③の部分は実行できているため、ファイルを読み込むことは出来ているはずなのですが、ユーザー定義関数が呼び出せません。
また、インクルード先(②の部分)で呼び出しているとインクルード元のecho $test;は実行出来ます。

一応実現できないわけでは無いのですが、絶対パスと相対パスの挙動の違いや使い分け方がイマイチ分からず、調べてもそれらしい答えが見つかりませんでした。
上記の使い方で問題なければ良いのですが、わからないまま何となく使うのがモヤモヤしてるので質問させて頂きました。

解る方いましたら詳しく解説して頂けませんか?
よろしくお願いします。

###発生している問題・エラーメッセージ
Fatal error: Uncaught Error: Call to undefined function testfunc() in

エラーメッセージ ``` ###該当のソースコード インクルード元(index.html) <?php include_once "http://localhost/hoge/test.php"; $test = testfunc();//① echo $test; ?> ---------------------------------------- インクルード先(test.php) <?php //$test = testfunc();//② var_dump("TEST"); // ③ function testfunc(){ $result = "てすと"; return $result; } ?> ###試したこと 上記のとおり。 ###補足情報(言語/FW/ツール等のバージョンなど) PHP Version 7.2.0 xamppのapacheでローカル環境でやっています。

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

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

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

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

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

guest

回答3

0

「includeは絶対パスを指定しよう」的な記事が多かったので、

を見て、
include_once "http://localhost/hoge/test.php";
と書いてしまったと言う事は、「絶対URL」と「絶対パス」を混同していると言う事だと思います。前半しか合ってない。。。

絶対パスは/から始まるパスです。

投稿2018/01/19 00:54

otn

総合スコア84505

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

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

退会済みユーザー

退会済みユーザー

2018/01/19 08:12

回答ありがとうございます。 >>「絶対URL」と「絶対パス」を混同 この違いを理解してませんでした。 __DIR__などの定数や$_SERVER変数を使った際に区切りが/だったり\ していたのですが、その辺りの意味の違いが分かっていませんでした。 ご指摘頂いてスッキリしました。今後その辺りについて詳しく調べてみようと思います。ありがとうございました。
guest

0

include_once "http://localhost/test.php";

絶対パスなら"/<local directory>/test.php"では?

投稿2018/01/18 22:11

編集2018/01/18 22:15
hichon

総合スコア5737

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

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

退会済みユーザー

退会済みユーザー

2018/01/18 23:16

すみません。書き込み用に書き直したのでディレクトリが抜けてました。 include_once "http://localhost/hoge/test.php"; です。 教えていただいた記述方法では読み込み自体が出来ませんでした。
hichon

2018/01/18 23:39

それだと、test.phpが「httpサーバーで実行された結果」を取得することになりますが、それは意図した動作ではないですよね?
退会済みユーザー

退会済みユーザー

2018/01/19 08:32

otnさんからご指摘頂いたように「絶対URL」と「絶対パス」を混同していて「httpサーバーで実行された結果」等の違いが分かっていませんでした。 hichonさんをはじめ皆さんに教えていただいて自分が何を分かってないかを知ることが出来ました。 これからその辺りを調べていきたいと思います。度々回答していただきありがとうございました。
guest

0

ベストアンサー

include_once "http://localhost/hoge/test.php";

hichon さんが指摘しているように、パスの指定方法が間違っています。
/var/www/html/hoge/test.php
のように指定してください。

__DIR__とか使って、指定するのが一般的かと。
自動的に定義される定数

追記
hichon さんのコメントが興味深かったので、実験してみましたw
前提:php.ini に allow_url_include=Onをセット

webinc.php

php

1<?php 2echo' 3<?php 4function hoge(){ 5echo "test"; 6} 7';

で、以下を実行

php

1<?php 2include_once "http://localhost/test/webinc.php"; 3hoge();

見事testが表示されました。

投稿2018/01/18 23:31

編集2018/01/19 00:56
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2018/01/19 00:06

include_once __DIR__."/test.php"; これで読み込みとユーザー定義関数の呼び出しも出来るようになりました。 早いご回答すごく助かりました。ありがとうございました。 __DIR__を見てみたら C:\xampp\htdocs\hoge と出てきたのですが、これと"http://localhost/test.php"(一応読み込みはできてたので)では意味的にどのような違いがあるのでしょうか? 前者または相対パスではユーザー定義関数の呼び出しが出来て、後者ではファイルは読み込めたのにユーザー定義関数の呼び出しが出来ないところが未だに疑問です。
退会済みユーザー

退会済みユーザー

2018/01/19 00:28

http://localhost/test.php の読み込みはできないと思います。 (設定上、矛盾が発生するはずなので) どのように読み込みを確認したのでしょうか?
退会済みユーザー

退会済みユーザー

2018/01/19 08:27

記入漏れがあり、include_once "http://localhost/hoge/test.php"でした。 確認方法はtest.phpのユーザー定義関数外に書いたechoやvar_dump()でその内容が表示されるかどうかで確認しました。(ソースの③のような感じ) その場合、test.php内で$test = testfunc();と変数に格納しておくと、インクルード元のindex.htmlで$testを使うことはできるんですよね。。 もしかしたらphp.iniの設定によるのかもしれませんが、otnさんのご指摘のように「絶対URL」と「絶対パス」を混同していて私がその挙動の違いを分かっていなかったのだと思います。今後その辺りを詳しく調べて見たいと思います。 度々回答していただきありがとうございました。
退会済みユーザー

退会済みユーザー

2018/01/19 10:28

*ちょっと混乱させる内容を含んでます。読み飛ばしてもらって構いません。ほぼ自己満足なコメントです。 === 設定上矛盾が発生するというのはまさに③のみ表示されるという点を指してコメントしました。 php.ini に allow_url_include=On をセットすることで、include に URL が使用できるようになりますが、localhost を指定すると、Webサーバが php を実行してしまうため、test.php の実行結果が引き渡されてしまいます。 今回の質問内容で言うと ``` test.php の出力結果。つまり var_dump("TEST")の結果。 <?php $test = testfunc();//① echo $test; ?> ``` みたいな感じで処理されてしまってます。 test.php の出力結果は、ただの text なので表示はされますが php の処理として何か行えるわけではありません。つまり、コードとしては読み込めないという矛盾が発生します。 追記で書いたのは、test.php の実行結果が、php のコードになっていたらどう処理されるだろう。って実験なのですが、見事に include されました。 で、記述したかったのは、ここからなのですが、試していないし、完全に余談です^^; Web サーバ側で 'http://localhost/hoge/' では、php ファイルを実行結果ではなく、ソースで返すように設定すれば、今回のコードは成立し、設定上の矛盾は回避できそうです。 実際に使用する機会はなさそうですが、面白かったです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問