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

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

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

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

Q&A

解決済

1回答

4590閲覧

PHPの名前空間(use)について教えてください

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

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

0グッド

2クリップ

投稿2016/09/29 07:28

編集2016/09/29 14:54

現在、PHPの名前空間について調べております。

PHPマニュアルの説明で不明な点があり、教えてください。

まず、名前空間へアクセスする方法は、非修飾形式、修飾形式、完全修飾形式の3つがあり、それぞれ下記の認識でおります。

#非修飾形式

ディレクトリ構造で言うとこの同ディレクトリ内からの指定。

test.phpは下記のように記述しています。

php

1<?php 2namespace test; 3function getGreeting() { 4 return 'おはよう'; 5}

別のファイルの index.phpからは下記のように関数へアクセスします。

php

1<?php 2namespace test; 3require_once 'test.php'; 4echo getGreeting();

このように \ を含まない指定が非修飾形式です。

###修飾形式

ディレクトリ構造で言うところのドキュメント相対パス。

test.phpは下記のように記述しています。

php

1<?php 2namespace test\suzuki; 3function getGreeting() { 4 return 'こんにちは'; 5}

別のファイルの index.phpからは下記のように関数へアクセスします。

php

1<?php 2namespace test; 3require_once 'test.php'; 4echo suzuki\getGreeting();

このように途中に\を含む指定が修飾形式です。

#完全修飾形式

ディレクトリ構造で言うところのルート相対パス。

test.phpは下記のように記述しています。

php

1<?php 2namespace test\tokyo\suzuki; 3function getGreeting() { 4 return 'こんばんは'; 5}

別のファイルの index.phpからは下記のように関数へアクセスします。

<?php namespace test; require_once 'test.php'; echo \test\tokyo\suzuki\getGreeting();

このように\を先頭に記述した指定が完全修飾形式です。

#PHPマニュアルの説明

名前空間の使用法: エイリアス/インポートの「例1 use 演算子によるインポート/エイリアス」の説明です。

名前空間つきの名前 (完全修飾形式の名前空間は区切り文字を含んだ Foo\Bar のようなもので、グローバルな場合は区切り文字を含まない FooBar のようになります) では先頭のバックスラッシュは不要で、推奨されないことに注意しましょう。

インポートする名前は完全修飾形式でなければならず、 現在の名前空間からの相対指定で処理されることはないからです。

#質問1

上記の説明ですが、下記の解釈でよろしいでしょうか。

  • useを使ってインポートするときは、必ず完全修飾形式で指定してね
  • useの場合は、完全修飾形式で指定する必要があるため、先頭のバックスラッシュを付けなくても、バックスラッシュを付けたように完全修飾形式で処理するよ
  • だから先頭のバックスラッシュは付けないでね

#質問2

説明では「インポートする名前は・・・」とありますが、エイリアスの場合でも同様に完全修飾形式で指定しなければならないということでよろしいでしょうか?

ということは、useを使う場合は先頭にバックスラッシュを付けることはないということでよろしいでしょうか?

ご存じの方いれば、教えてくださいm(__)m

#加筆・訂正履歴

  • 2016/09/29 23:50 test.phpの追加と非修飾名、修飾名、完全修飾名の訂正

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

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

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

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

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

guest

回答1

0

ベストアンサー

きっと、test.phpの中でネームスペースを使っているんですよね?
だとすると、非修飾名・修飾名・完全修飾名の例がおかしいです。
完全修飾名の中に、「test」というネームスペースがどこにもないですよ?

PHP

1// test.php 2namespace tokyo\suzuki; 3function getGreeting() { 4 // 何かの処理 5}

PHP

1// 例 2include "test.php"; 3 4use tokyo\suzuki; 5getGreeting(); // 非修飾名 6 7use tokyo; 8suzuki\getGreeting(); // 修飾名 9 10use foo; // 関係のないネームスペース 11\tokyo\suzuki\getGreeting(); // 完全修飾名 12

質問1・質問2共合っているようです。
useはnamespaceと記述を合わせるようにしたんでしょうね。

投稿2016/09/29 10:14

編集2016/09/29 10:17
shi_ue

総合スコア4437

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

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

退会済みユーザー

退会済みユーザー

2016/09/29 15:04 編集

回答ありがとうございます。 test.phpの記述がなく、非常に分かり難い質問でした。申し訳ありませんm(__)m test.phpの記述を追記いたしました。 完全修飾形式の例に \test が抜けておりましたので、追記しました。 私の認識は訂正した通りです。 お手数ですが、訂正した内容でも誤りがあれば、コメントでご指摘いただけると嬉しいです。 また、質問1・2に関して、私の認識であっているとのことで安心しました^^ お忙しい中、回答ありがとうございましたm(__)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問