PHPの名前空間インポートについて

このQ&Aのポイント
  • PHPのグローバル空間において、useキーワードを用いた際のインポートについて質問です。
  • グローバル空間内でuse ¥SAMPLEだとインポートできるのに、use SAMPLEだとインポートできない理由(仕様)を教えてください。
  • グローバル空間内でuseキーワードを使う場合、修飾名でクラスを呼び出す必要があります。
回答を見る
  • ベストアンサー

PHPの名前空間インポートについて

PHPのグローバル空間において useキーワードを用いた際のインポートについて質問です。 ---------------------------------------------------------------------------------------------------------- sample.php <?php //グローバル空間 namespace{ use SAMPLE;//はインポートできない。 use ¥SAMPLEはインポートできる。 print "名前空間のインポート"; print PHP_EOL; $hoge = new SAMPLE\TestClass(); } //任意の名前空間 namespace SAMPLE{ class TestClass{ public function __construct (){ print __NAMESPACE__; } } } ---------------------------------------------------------------------------------------------------------- とあった場合、グローバル空間内でuseキーワードを用いる場合 use ¥SAMPLE; だとインポートができて use SAMPLE: だとインポートできない理由(というか仕様)が理解できません。 具体的には PHP Warning: The use statement with non-compound name 'SAMPLE' has no effect in という警告がでます。 上記の例の場合たとえ use ¥SAMPLEでインポートしても 実際にクラスを使用する場合は new SAMPLE¥TestClass(); と修飾名でコールしなければならないので コードを書く労力としてはあまり意味がないのですが。。。。。 どなたか グローバル空間内で上記の様に use ¥SAMPLEだとインポートできるのに use SAMPLEだとインポートできない理由(仕様)、このように理解すればよいという理由を ご教授ください。よろしくお願いします。

  • PHP
  • 回答数1
  • ありがとう数0

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

インポートはできてます。 でているのは警告で、no effectと書いてありますので、効果が無い、ということです。 「¥」のないものは非修飾名というものになり、確かに、SAMPLEという名前空間をuseしても、エイリアスを貼る効果はありません。 namespace SAMPLE\Foo{ class Example{ public functoin test(){ echo "test"; } } } と合った場合に、 use SAMPLE\Foo; $obj = new Foo\Example(); とするとエラーは出てこないと思います。SAMPLEの部分を記述しなくても呼び出せるのでエイリアスを貼る意味はあったと。 で、 use \SAMPLEとした時に警告が出てこない理由は、完全修飾名だからです。 http://www.php.net/manual/ja/language.namespaces.rules.php こちらを見ていただくと、 「¥」で区切られていない記述は、非修飾名であり、「¥」を含まれている記述は修飾名となりますが、 先頭に「¥」がある場合は、ソレが先頭以外で非修飾名でも修飾名でも「完全修飾名」とみなされます。 その為、useで警告がでないということになります。

関連するQ&A

  • PHPの名前空間について質問です。

    以下のようなコードがあるとします。 <?php namespace { print_r(get_declared_classes()); } namespace A\B\C{ print_r(get_declared_classes()); } ?> この場合は問題なく実行されるのですが 以下のようなコードになった場合名前空間A\\B\\Cのコード内にある ArrayObjectがみつからないというfatalerrorがでます。 <?php namespace { print_r(get_declared_classes()); $noneObj = new ArrayObject(array("key01" => "グローバル空間")); print $noneObj["key01"]; } namespace A\B\C{ print_r(get_declared_classes()); $abcObj = new ArrayObject(array("key01" => "名前空間 ABC")); print $abcObj["key01"]; } ?> これはどういうことなのでしょうか? 組み込みの関数は特定の名前空間内でも被修飾名にて呼び出せるにもかかわらず 組み込みのクラスはなぜか絶対修飾名でないとクラスを呼ぶことができません。 この理由をご教授ください。 よろしく御願いします。

    • ベストアンサー
    • PHP
  • PHPの名前空間に関して質問です。

    PHPの名前空間の仕様において コールの仕方が三通りあるとおもいます。 1=>被修飾名 (これは、従来どおりのコールのしかたですよね。 特定の名前空間内でその名前空間で定義した関数やクラスをその名前空間内でコールする場合は、 new TestClass(); といった具合に、名前空間は意識せずにコールできます。 2=>完全修飾名 (これは各名前空間内においてグローバル空間内で定義されたクラス等をコールするときにしようしますよね? A¥B¥Cという名前空間からD¥E¥Fという全く別の名前空間で定義されたクラス等をコールするときもこの、完全修飾名でないとコールできないとおもいます。 さて、最後の 3=>修飾名でのコールですが たとば、$obj = new A¥B¥C¥TestClass(); というコールの仕方ですよね。もっというと頭にバックスラッシュの使ない名前空間の使いかた。これって、実際はグローバル名前空間ないでのみしか使えないですよね? グローバル空間意外の特定の名前空間内でこの修飾名でのコールができる状況って存在しないですよね? もしある場合どういう状態でしょうか? よろしく師事ください。

    • ベストアンサー
    • PHP
  • PHPの名前空間について

    PHP5.3~からの名前空間について質問です。 この名前空間、私は最初JAVAやPerlなどのクラスやパッケージ的な動き・・・・・つまり 実際にディレクトリに分けて分割して管理するようなものだと思っていたのですが foo/bar/hoge.java import foo.bar; で実際に new foo.bar.hoge.(); としないといけない箇所を new hoge(); だけで処理できるという動き・・・。 perlでもパッケージやクラスなんかは似たような動きですよね? でもPHPの名前空間は、ディレクトリにわけたりしないようなのですが、 これは、意味があるのでしょうか? PHPの場合はただ、関数やクラスに別名をつけれるだけですか? 特に、必要とは思えないのですが 識者の方ご教授下さい。

    • ベストアンサー
    • PHP
  • 【PHP】コンストラクタ―について

    コンストラクタ―について検索して調べると概ね以下のように説明されています。 ---------------------------------- コンストラクタ インスタンス生成時にオブジェクトを初期化したい場合にコンストラクタメソッドを使用できます。 コンストラクタメソッドは以下のように引数を指定する事もでき、インスタンス生成時に__construct()が自動的に実行されます。 ---------------------------------- イマイチ判然としません。 「newによってインスタンスを作成される時に自動的に呼び出されるもの」と自分では解釈していました。 例えば以下のような場合 public function __construct($text) { $this->text = $text; } 【$text】の値をnewされることによって自動的に「保持」されるということなのでしょうか? 実際に表示させるときは【$posts[0]->show();】(show()メソッド)で表示させるわけですよね? その上には【private $text;】でプロパティがあります。 ごく基本的な質問かと思いますが、【public function __construct($text)】 コンストラクタ―を作成する理由がよくわかりません。 初学者でも分かりやすいように解説していただけないでしょうか? 宜しくお願い致します。 <記述サンプル> ------------------------------- <?php class Post { private $text; public function __construct($text) { $this->text = $text; } public function show() { printf('%s' . PHP_EOL, $this->text); } } class SponsoredPost extends Post { private $sponsor; public function __construct($text, $sponsor) { parent::__construct($text); $this->sponsor = $sponsor; } public function showSponsor() { printf('%s', $this->sponsor); } } $posts = []; $posts[0] = new Post('hello'); $posts[1] = new Post('hello again'); $posts[2] = new SponsoredPost('hello hello', 'Yahoo'); $posts[0]->show(); $posts[1]->show(); $posts[2]->show(); $posts[2]->showSponsor();

    • ベストアンサー
    • PHP
  • PHP5でクラスを作成しています。

    PHP5でクラスを作成しています。 コンストラクタの段階で論理エラーにしたくて、インスタンス値をnullにしたいです。 つまり直ちにプログラムを止めずに、クラスの生成(インスタンス化)を失敗させる 方法を__construct()関数内でどのように書けば良いのでしょうか? class Sample { function __construct() { // この中で処理の異常が発生! // インスタンス作成を失敗させる or インスタンス値をヌルにする。 //? //?どのように書けば?? //? } } $a = new Sample(); if ($a === null) { printf("正しくインスタンスの生成ができませんでした。"); } よろしくお願いします。

    • 締切済み
    • PHP
  • WikipediaのPHPによるAPIについて

    http://wikipedia.simpleapi.net/ にサンプルが出ていて、それを利用しようと思っています。 --以下サンプル <?php // キーワード指定 $keyword = "多田富雄"; // APIのURL $url = "http://wikipedia.simpleapi.net/api?keyword=".urlencode($keyword)."&output=php"; // データを取得 $data = file_get_contents($url) ; // PHPシリアライズパーサーを利用して解析し、配列に入れる $array = unserialize($data); // 配列をforeachで表示するデモ print "<H1>Wikipedia情報</H1>"; foreach ($array as $key => $value) { print "<a href=\"".$value[url]."\"><strong>".$value[title]."</strong></a>\n<br/>". $value[body] ."<hr/>\n\n"; } ?> --サンプル以上 実際のwikipediaで"多田富雄"を入力し調べた時と、上記サンプルを起動してprintした時では内容が異なります。 (上記サンプルの方がかなり少ない) unserialize関数もしくはfile_get_contents関数か、別の要因かよくわかりません。 ご経験のおありの方、ヒントだけでもいただけると助かります。 なお、私のphp経験は50-100時間程度、環境はXP,Apache2,php5です。

    • ベストアンサー
    • PHP
  • PHP に詳しい方教えてください

    PHPを勉強していて、以下のサンプルに出会ったのですが、これについて 2 点教えてください。 (1) <?php?> の括りを分ける理由。 (2) $data は、なぜカッコに入れられているのか。 <?php $date = sprintf('%04d年 %02d月 %02d日',2013, 1, 23); ?> <?php print ($date); ?>

    • ベストアンサー
    • PHP
  • HTML+TIME phpで動作させたい

    初めて質問させて頂きます。 HTML+TIMEタグについて質問があります。 HTML+TIMEでコードを書き ~.htmlで保存した場合は表示をしてくれるのですが ~.phpにて保存すると何も表示してくれません <head>タグ内で以下のように記述しています。 <?IMPORT namespace="t" implementation="#default#time2"> QNo.941049を参考にして <?IMPORT namespace="t" implementation="#default#time2"?> としても同じ結果でした。 念のため、このコードを外すと~.phpでも表示はしてくれるのですが HTML+TIMEタグを使ったコントロールが機能しませんでした。 これが原因だと思われます。 おそらく,PHPファイルだと<?php~でスクリプトを書くところphpが無いため 止まってしまうのが原因かと思われます。 この現状を解決する方法はありますでしょうか。 ご存知の方がおられましたら回答いただければ幸いです。 よろしくお願いします。

    • 締切済み
    • CSS
  • importについて

    ここで、過去ログを拝見したしまして、同じような書き込みを参考にしてのですが、自分には少し理解力がなく、教えてください。 参考にした、過去ログは http://oshiete1.goo.ne.jp/kotaeru.php3?q=214246 です。 この質問と同じなんですが、Beanのクラスをservletにimportしたいのです。 BeanをTestBean.javaとしまして、 --------------------------------------------------- package sample; import java.io*; ................. ................. public class TestBean{ --------------------------------------------------- servletを --------------------------------------------------- import sample.TestBean; import java.io.*; public class TestServlet extends --------------------------------------------------- などとした時に、まず、TestBeanをコンパイルして、サーバーに置いても いいのでしょうか? 自分の場合はJRunを使っているので C:\Program Files\Allaire\JRun\servers\default\default-app\WEB-INF\classes\sample に置いて、もちろん、win98なので、autoexec.batで編集を選びまして、 SET=C:\Program Files\Allaire\JRun\servers\default\default-app\WEB-INF\classes\sample.jar;%PATH% としました。 でも、この部分が↑自身がないです・・・。 http://java.sun.com/j2se/1.3/ja/docs/ja/tooldocs/win32/classpath.html も読んだのですが、どうも理解が乏しいです・・。 ご教授できたらお願いします。

    • ベストアンサー
    • Java
  • php クラス

    クラスの勉強をしているのですが、 記憶寿命をfunctionの中で完結させsample2以降でも同じ変数などを使えるようにするため定義済み関数内でクラスを処理したいのですが下記のエラーが出てしまいます。 functionの中でクラスを簡潔させるにはどのようにすればよいでしょうか?また、これはなぜエラーが起きているのでしょうか? function sample1(){ $pr=new parson; $pr->name="鈴木"; $pr->age=56; print $pr->getname(); print $pr->getage(); class parson { public $name="鈴木"; public $age=56; function getname(){return $this->name;} function getage(){return $this->age;} }} sample1(); Fatal error: Uncaught Error: Class 'parson' not found in hoge/class.php:11 Stack trace: #0 /hoge/class.php(27): sample1() #1 {main} thrown in /hoge/class.php on line 11

    • ベストアンサー
    • PHP