159

class のファイルがありますResp。パスは次のとおりです。

C:\xampp\htdocs\One\Classes\Resp.php

そしてindex.php、このディレクトリにファイルがあります:

C:\xampp\htdocs\Two\Http\index.php

このindex.phpファイルで、クラスをインスタンス化しますResp

$a = new Resp();

requireまたはincludeキーワードを使用して、ファイルをクラスに含めることができることはわかっています。

require("One\Classes\Resp.php");       // I've set the include_path correctly already ";C:\xampp\htdocs". It works.
$a = new Resp();

requireしかし、 orを使用せずにクラスをインポートしたいincludeuseキーワードの仕組みを理解しようとしています。これらの手順を試しましたが、何も機能しません:

use One\Classes\Resp;
use xampp\htdocs\One\Classes\Resp;
use htdocs\One\Classes\Resp;
use One\Classes;
use htdocs\One\Classes;    /* nothing works */

$a = new Resp();

それは言います:

Fatal error: Class 'One\Classes\Resp' not found in C:\xampp\htdocs\Two\Http\index.php

キーワードはどのように機能しuseますか? クラスのインポートに使用できますか?

4

10 に答える 10

211

useいいえ、キーワードでクラスをインポートすることはできません。include/requireステートメントを使用する必要があります。PHP オートローダーを使用する場合でも、オートローダーは内部的 にincludeまたはを使用する必要があります。require

利用目的キーワード:

同じ名前の 2 つのクラスがある場合を考えてみましょう。奇妙に感じるかもしれませんが、大きな MVC 構造を扱っている場合に発生します。したがって、同じ名前のクラスが 2 つある場合は、それらを異なる名前空間に配置します。ここで、オートローダーが両方のクラスをロードしていて (によってrequire実行)、クラスのオブジェクトを使用しようとしているときを考えてみましょう。この場合、コンパイラは 2 つのクラス オブジェクトのうち、どのクラス オブジェクトをロードするのか混乱します。コンパイラが決定を下すのを助けるために、ステートメントを使用して、どのuseステートメントを使用するかを決定できるようにすることができます。

現在、主要なフレームワークはincludeor requirevia composerand を使用していますpsr

1)作曲家

2) PSR-4オートローダー

それらを確認すると、さらに役立つ場合があります。エイリアスを使用して正確なクラスを指定することもできます。たとえばMailer、2 つの異なる名前空間を持つ、同じ名前の 2 つのクラスがあるとします。

namespace SMTP;
class Mailer{}

namespace Mailgun;
class Mailer{}

また、両方の Mailer クラスを同時に使用したい場合は、エイリアスを使用できます。

use SMTP\Mailer as SMTPMailer;
use Mailgun\Mailer as MailgunMailer;

これらのクラス オブジェクトにアクセスする場合は、コードの後半で次のようにします。

$smtp_mailer = new SMTPMailer;
$mailgun_mailer = new MailgunMailer;

元のクラスを参照します。

類似のクラス名がない場合、useキーワードを使用しないと混乱する人もいるかもしれません。さて、引数として使用されるクラスでステートメントが実行さ__autoload($class)れるときに自動的に呼び出される関数を使用できます。これuseにより、実行時に必要に応じてその場でクラスをロードするのに役立ちます。

クラスオートローダーの詳細については、この回答を参照してください。

于 2014-08-05T12:34:39.403 に答える
100

use何も含みません。指定された名前空間 (またはクラス) を現在のスコープにインポートするだけです。

クラスを自動ロードしたい場合 - 自動ロードについて読んでください

于 2012-06-10T00:00:14.600 に答える
8

とにかくクラスを含める/要求する必要があります。そうしないと、PHP は名前空間を認識できません。ただし、同じファイル
で行う必要はありません。たとえば、ブートストラップファイルで実行できます。(またはオートローダーを使用しますが、実際にはそれはトピックではありません)

于 2012-06-10T00:00:31.857 に答える
4

この問題は、クラスの名前 (この場合は「\」で区切る) を取得し、それをディレクトリ構造にマップするオートローダーを使用する必要がある可能性が最も高いです。

PHPのオートローディング機能については、こちらの記事をご覧ください。フレームワークには、このタイプの機能の多くの実装が既にあります。

実は私も以前実装したことがあります。ここにリンクがあります。

于 2012-06-10T00:00:39.840 に答える
3

useキーワードは PHP でのエイリアシング用であり、クラスをインポートしません。これは本当に役立ちます
1) 異なる名前空間に同じ名前のクラスがある場合
2) 非常に長いクラス名を何度も使用しないようにします。

于 2016-04-05T06:54:45.420 に答える
3

Green に同意します。Symfony には名前空間が必要なので、使用しないのはなぜですか?

以下は、コントローラ クラスの例の開始方法です。

名前空間 Acme\DemoBundle\Controller;

Symfony\Bundle\FrameworkBundle\Controller\Controller を使用します。

class WelcomeController extends Controller { ... }

于 2014-12-01T21:49:30.947 に答える