{
    "componentChunkName": "component---src-templates-blog-post-jsx",
    "path": "/post/fix-require-relative-path-of-php/",
    "result": {"data":{"site":{"siteMetadata":{"title":"WEB EGG","author":"Leko - CTO at Yuimedi"}},"markdownRemark":{"id":"be046d7e-ac33-583f-bb78-8581acf26dc5","excerpt":"photo by masahiko こんにちは。 phpでクラスベースの開発をしているときに、 require_onceで相対パスを使って読み込むときにハマったのでメモ。 エラーが起こるケース 例えばこういうディレクトリ構造で、 C.phpをrequireしたB.phpを、A.phpがrequireするときに、B…","html":"<p><q>photo by <a href=\"http://www.flickr.com/photos/masahiko/\" target=\"_blank\">masahiko</a></q></p>\n<p>こんにちは。 phpでクラスベースの開発をしているときに、 require_onceで相対パスを使って読み込むときにハマったのでメモ。</p>\n<!--more-->\n<h2 id=\"エラーが起こるケース\" style=\"position:relative;\"><a href=\"#%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%8C%E8%B5%B7%E3%81%93%E3%82%8B%E3%82%B1%E3%83%BC%E3%82%B9\" aria-label=\"エラーが起こるケース permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>エラーが起こるケース</h2>\n<p>例えばこういうディレクトリ構造で、</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">/\n    - A.php\n    - D.php\n    - Class/\n        - B.php\n        - C.php</code></pre></div>\n<p>C.phpをrequireしたB.phpを、A.phpがrequireするときに、B.phpで</p>\n<div class=\"gatsby-highlight\" data-language=\"php\"><pre class=\"language-php\"><code class=\"language-php\"><span class=\"token php language-php\"><span class=\"token delimiter important\">&lt;?php</span>\n\n<span class=\"token keyword\">require_once</span><span class=\"token punctuation\">(</span><span class=\"token string double-quoted-string\">\"C.php\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></span></code></pre></div>\n<p>と書くとB.phpのrequire_onceは失敗します。 B.phpとC.phpは同じ階層にあるから読み込まれるはずなのに。 id=“practive”></p>\n<h2 id=\"phpの規則\" style=\"position:relative;\"><a href=\"#php%E3%81%AE%E8%A6%8F%E5%89%87\" aria-label=\"phpの規則 permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>phpの規則</h2>\n<p>調べてみるとすぐに見つかりました。<figure></p>\n<p><q>PHPでは、「実行したファイルのあるディレクトリが常に実行時のカレントディレクトリになる」っていう規則があるためエラーとなってしまうのです。 この問題は、実行ファイルのディレクトリではなく、参照しているファイルのディレクトリを基にパスを取得することで回避できます。</q> <figcaption> <cite><a href=\"http://www.hoge256.net/2007/08/61.html\" target=\"_blank\">PHP の include, require で相対パスを指定して読み込む場合のメモ – hoge256ブログ</a></cite> </figcaption> </figure></p>\n<p>とあるように、A.phpを実行しているので、 B.phpのrequire_once(“C.php”)はA.phpと同階層のC.phpを探してエラーになるようです。 これを回避するには、**dirname(<strong>FILE</strong>)**を使います。section id=“solved”></p>\n<h2 id=\"dirnamefile\" style=\"position:relative;\"><a href=\"#dirnamefile\" aria-label=\"dirnamefile permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>dirname(<strong>FILE</strong>)</h2>\n<p>dirname(<strong>FILE</strong>)は、自分自身へのパスを返します。 B.phpで用いた場合には、“/Class”という文字列が返ります。 <strong>パスの最後に/は付かないので、要注意。</strong> これを使って、</p>\n<div class=\"gatsby-highlight\" data-language=\"php\"><pre class=\"language-php\"><code class=\"language-php\"><span class=\"token php language-php\"><span class=\"token delimiter important\">&lt;?php</span>\n\n<span class=\"token keyword\">require_once</span><span class=\"token punctuation\">(</span><span class=\"token function\">dirname</span><span class=\"token punctuation\">(</span><span class=\"token constant\">__FILE__</span><span class=\"token punctuation\">)</span><span class=\"token operator\">.</span><span class=\"token string double-quoted-string\">\"/C.php\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">//C.phpを読み込む </span>\n<span class=\"token keyword\">require_once</span><span class=\"token punctuation\">(</span><span class=\"token function\">dirname</span><span class=\"token punctuation\">(</span><span class=\"token constant\">__FILE__</span><span class=\"token punctuation\">)</span><span class=\"token operator\">.</span><span class=\"token string double-quoted-string\">\"/../D.php\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">//D.phpを読み込む</span></span></code></pre></div>\n<p>と書くことで、実行されるファイルやカレントディレクトリを気にすること無く 相対パスでrequireをすることが出来ます。</p>","timeToRead":2,"frontmatter":{"title":"phpでrequire_onceするときに相対パスでハマった","tags":["PHP"],"date":"January 06, 2013","featuredImage":{"childImageSharp":{"fluid":{"tracedSVG":"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='400'%20height='150'%20viewBox='0%200%20400%20150'%20preserveAspectRatio='none'%3e%3cpath%20d='M29%204a111%20111%200%2000-2%2022v3l5-2c6-1%206%200%205-7-2-18-3-20-5-20s-3%201-3%204m137%200l-2%205%202%201%2015%205a1421%201421%200%200031%2015c5%202%206%202%2016%201%2011-1%2011-2%205-4-7-2-7-3-1-3l13%203%209%204-1%207v8h3a794%20794%200%200128-5l1-8v-7l-7-3a1952%201952%200%2000-62-19l-13-4h-36l-1%204m174-3c4%200%206%202%202%202-2%200-2%200-1%201l2%203a1530%201530%200%200047-2%20180%20180%200%2000-50-4M115%2015l-5%2024c-1%203-2%203%206%204a219%20219%200%200042-4c4%200%203-1-7-8l-9-6a229%20229%200%2000-24-16c-1-2-1-2-3%206m45-2l1%204c2%202%201%208-1%2011-2%201%200%203%204%205l4%202a276%20276%200%200040-2l-46-22-2%202M83%2030c0%205%200%206%202%206v1l-2%201%204%201%209%201-12-16-1%206M0%2044v9h4a8467%208467%200%2000114%2015l5%201V58l-1-11a1565%201565%200%2000-90-8L3%2036H0v8m314-2l-35%205c-56%207-58%208-55%2011%204%204%205%209%206%2024%201%2016%204%2028%208%2028l1%201h1c1-1%206-3%2011-3l5-1%207-1%2019-2%2040-4c4%202%202%203-4%203h-4c2%200%202%200%201%202-2%204-4%205-9%205-3-1-5%200-7%201l-9%202-7%201c-1%202-1%202%202%202l3%202%204%201%204%201h-4c-4%200-5%200-2%202%201%201-1%202-8%202l-10-1-2-2c0-2-2-3-4-3s-4-1-5-3c-3-3-4-4-6-1h-6c-5%200-5%200-4%202%200%203%202%204%202%201%200-1%201-2%203-1%203%200%204%203%200%202-2%200-2%201-2%202%200%203-1%204-3%203v3l3%202v3c0%202%201%203%202%200%201-1%201-1%204%201l4%203v2l1%201%206%202%207%202c4%200%205%201%203%203l-3%201h-9l-3-2v-1c2-1%202-2%201-2h-2c-1%202-4%202-5-1v-2l3%201v-1l-3-2-3-1c-2-2-1%200%201%206l3%204v1c0%203%204%206%205%203h1l21%201%2021-1%203-1%204%201a442%20442%200%200080-3c-2-2%200-3%204-2l4-1%201-1v3l1%202a904%20904%200%2000-1-96l-3%204-2%201%201%201c2-1%202%201%200%2010%200%202%200%203%202%203l3%203-1%201a2736%202736%200%2000-63-18c1%200%201-2-1-5-2-4-3-5-4-4-1%202-2%201-2-2v-3l3-1c0-1-4-1-18%201M207%2067l-1%2041-4%201c-5%200-7%203-3%203%202%200%202%200%200%201l-3%201h3c2%200%203-1%203-2h2l1%201c0-1%201-1%201%201v19l-17%204c-16%204-16%204-16%207%200%206-2%206%2032%206%2029%200%2031%200%2031-2a841%20841%200%2001-13-32l-6-15-1-17c-1-14-1-17-3-21-5-11-6-11-6%204M1%20104v46h125l1-12%201-31a101%20101%200%20012-32L1%2058v46m150-4c-2%202%200%209%202%2011l3%201-3%202c-3%203-4%205-2%2018%201%2018%201%2018%2011%2018h8v-4c1-12%202-16%204-15l2-1c-1-1%200-2%201-3l2-2-3-5-3-5-2-1-3-2-4-3c0-1-1-2-2-1-2%201-4-1-3-3l-1-2v1c1%202-2%201-3-1l-1-3%201-1c0-1-2-1-4%201m201%2011l-4%201c-4%201-6%203-2%203l6%201%205%202%205%201%2010%202%2010%203%207%203%206%201-1%201h-2l3%201%203%201%201%201v-14c1-1%201-1-1-1l-3%201%201%201%201%201-2%201-3-1-5-3-5-1c3%200-2-2-5-2l-4-1h-2c1%202-4%204-5%203l-5-1c-4%200-5%200-4-2%201-1%201-1-1-1-1%200-2%200-1-1l-1-1-2%201'%20fill='%23d3d3d3'%20fill-rule='evenodd'/%3e%3c/svg%3e","aspectRatio":2.672,"src":"/static/fd2e02b87e6bbb7b3e66fd478de8f554/4fe8c/featured-image.jpg","srcSet":"/static/fd2e02b87e6bbb7b3e66fd478de8f554/466a3/featured-image.jpg 334w,\n/static/fd2e02b87e6bbb7b3e66fd478de8f554/4fe8c/featured-image.jpg 600w","srcWebp":"/static/fd2e02b87e6bbb7b3e66fd478de8f554/ad85c/featured-image.webp","srcSetWebp":"/static/fd2e02b87e6bbb7b3e66fd478de8f554/cd98f/featured-image.webp 334w,\n/static/fd2e02b87e6bbb7b3e66fd478de8f554/ad85c/featured-image.webp 600w","sizes":"(max-width: 600px) 100vw, 600px"}}}}}},"pageContext":{"slug":"/fix-require-relative-path-of-php/","previous":{"fields":{"slug":"/convert-icns-to-png/"},"frontmatter":{"title":"MacのicnsファイルをPNG形式に変換する方法","tags":["Mac"]}},"next":{"fields":{"slug":"/display-error-temporary-in-php/"},"frontmatter":{"title":"PHPで一時的にエラーを表示する方法","tags":["PHP"]}}}},
    "staticQueryHashes": ["2585454260","2954598359"]}