PHPで名前空間とクラスのオートローディングを使用することは、モダンなアプリケーション開発において非常に重要です。名前空間は、クラスや関数、定数が他のコードと衝突するのを防ぐために使用されます。また、オートローディングは、必要なクラスファイルを手動で読み込む手間を省き、効率的な開発を実現します。本記事では、PHPの名前空間とオートローディングの基本概念から、Composerを用いた設定方法、PSR-4標準の遵守、さらには実際のプロジェクトでの応用まで、ステップバイステップで解説します。
名前空間の基本概念
名前空間とは、PHPにおけるクラスや関数、定数を整理し、他のコードとの衝突を避けるための仕組みです。特に大規模なプロジェクトやサードパーティライブラリを利用する際に、同じ名前のクラスや関数が存在しても競合しないようにする役割を果たします。
名前空間の定義方法
PHPで名前空間を定義する際は、namespace
キーワードを使用します。通常、ファイルの先頭に名前空間を宣言します。
<?php
namespace MyApp\Controllers;
class UserController {
// クラス定義
}
?>
この例では、MyApp\Controllers
という名前空間にUserController
クラスを定義しています。この方法により、他のプロジェクトで同名のクラスがあっても問題なく使用できます。
名前空間の利点
- クラスの競合回避: 他のコードベースと同名のクラスが存在しても、名前空間によって区別できます。
- コードの整理: プロジェクト内でクラスや関数を整理し、構造化することでメンテナンス性が向上します。
- 大規模プロジェクトでの必須機能: 名前空間を使用することで、クリーンで管理しやすいコードベースを保つことができます。
クラスのオートローディングとは
オートローディングとは、PHPが必要なクラスを動的に読み込む仕組みのことです。これにより、各クラスを手動でrequire
やinclude
する必要がなくなり、コードがシンプルかつ管理しやすくなります。
PHPのオートローディング機能
PHPでは、spl_autoload_register()
関数を使ってオートローディングを設定できます。この関数は、指定したクラス名が見つからない場合に自動的に呼び出され、適切なファイルをロードする処理を行います。
<?php
spl_autoload_register(function ($class) {
include 'classes/' . $class . '.php';
});
?>
この例では、classes/
ディレクトリにあるクラスファイルを自動的に読み込む仕組みを構築しています。
オートローディングの利点
- コードの簡潔化: 各クラスを手動で読み込む必要がなくなるため、コードがシンプルになります。
- 柔軟性の向上: クラスのファイル構造が増えても、オートローディングの設定があるため、簡単に対応できます。
- エラーの減少: クラスファイルの読み込み漏れがなくなるため、エラーの発生率が低下します。
オートローディングを活用することで、プロジェクトの拡張やメンテナンスが容易になり、開発効率が向上します。
Composerによるオートローディングの設定
Composerは、PHPで広く使われる依存関係管理ツールであり、オートローディングの設定にも役立ちます。Composerを使うことで、手動でオートローディングを設定する必要がなくなり、プロジェクト全体のクラス管理が容易になります。特にPSR-4標準に準拠したオートローディングが簡単に実装可能です。
Composerのインストール
まず、Composerがインストールされているか確認し、必要であればインストールします。ターミナルで以下のコマンドを使用します。
composer --version
Composerがインストールされていない場合、公式サイトからインストールを行ってください。
Composer.jsonの設定
プロジェクトのルートディレクトリにcomposer.json
ファイルを作成し、オートローディング設定を追加します。以下はPSR-4準拠のオートローディング設定例です。
{
"autoload": {
"psr-4": {
"MyApp\\": "src/"
}
}
}
この例では、MyApp
という名前空間をsrc/
ディレクトリ内にマッピングしています。
オートローダーの生成
設定が完了したら、Composerを使ってオートローダーを生成します。ターミナルで以下のコマンドを実行します。
composer dump-autoload
これで、Composerが自動的にクラスファイルをロードできるようになります。
オートローダーの使用
プロジェクト内でComposerのオートローダーを使用するためには、vendor/autoload.php
をプロジェクトにインクルードします。
<?php
require 'vendor/autoload.php';
このコードをプロジェクトのエントリポイントに追加することで、Composerのオートローディング機能が利用できるようになります。これにより、手動でクラスファイルをインクルードする必要がなくなり、コード管理が効率化されます。
PSR-4標準に基づくオートローディング
PSR-4は、PHPでクラスを自動的にロードするための標準的なガイドラインです。この規格に従うことで、クラスの名前空間とファイルシステムのディレクトリ構造を統一し、他の開発者やツールがプロジェクトを簡単に理解し、扱えるようになります。PSR-4を使用すると、クラスのオートローディングが一貫性を持ち、プロジェクトの拡張や保守がしやすくなります。
PSR-4の基本的なルール
PSR-4では、名前空間とファイルパスが1対1で対応することが求められます。つまり、名前空間の階層は、そのままディレクトリ構造に反映されます。例えば、MyApp\Controllers\UserController
クラスは以下のような構造になります。
src/
Controllers/
UserController.php
クラス名とファイル名は一致し、名前空間はディレクトリと一致するように設定します。
PSR-4をComposerで利用する
Composerを使ってPSR-4準拠のオートローディングを設定するには、composer.json
ファイルに以下のように設定を追加します。
{
"autoload": {
"psr-4": {
"MyApp\\": "src/"
}
}
}
この設定により、MyApp
という名前空間がsrc/
ディレクトリにマッピングされ、MyApp
内のクラスは自動的に適切な場所から読み込まれます。
PSR-4のメリット
- 一貫性のあるコード構造: 名前空間とファイルパスの対応関係が明確で、プロジェクト全体の構造が整理されます。
- メンテナンスの容易さ: ファイルとクラスの関係が明確で、開発者は特定のクラスやファイルを簡単に見つけられます。
- 幅広い互換性: PSR-4は業界標準となっており、多くのライブラリやフレームワークがこの規格に準拠しています。
PSR-4を使用することで、規模が大きいプロジェクトでもクラスの管理が効率的になり、他の開発者がプロジェクトに参加してもすぐに理解できる状態を保つことができます。
実際にオートローディングを設定してみよう
ここでは、実際にPHPプロジェクトでオートローディングを設定する手順を具体的に解説します。小規模なプロジェクトを例に、Composerを用いてPSR-4準拠のオートローディングを実装します。
プロジェクト構造を作成する
まず、プロジェクトの基本的なディレクトリ構造を作成します。以下のように、src
ディレクトリ内にクラスファイルを配置し、名前空間に対応させます。
my_project/
│ composer.json
│
└───src/
└───Controllers/
│ UserController.php
└───Models/
│ User.php
ここでは、UserController
クラスとUser
モデルクラスをそれぞれControllers
とModels
ディレクトリに配置します。
クラスファイルに名前空間を定義する
次に、クラスファイルに名前空間を定義します。src/Controllers/UserController.php
に以下のように記述します。
<?php
namespace MyApp\Controllers;
class UserController {
public function showUser() {
echo "Displaying user details";
}
}
同様に、src/Models/User.php
には以下のように記述します。
<?php
namespace MyApp\Models;
class User {
public $name = "John Doe";
}
各クラスには、それぞれのディレクトリに対応した名前空間を定義します。
Composerでオートローダーを設定する
次に、プロジェクトのルートディレクトリにあるcomposer.json
ファイルにオートローディングの設定を追加します。
{
"autoload": {
"psr-4": {
"MyApp\\": "src/"
}
}
}
この設定により、MyApp
名前空間がsrc/
ディレクトリにマッピングされ、クラスが自動的にロードされるようになります。
Composerでオートローダーを生成する
次に、Composerを使ってオートローダーを生成します。ターミナルで以下のコマンドを実行します。
composer dump-autoload
このコマンドにより、vendor/autoload.php
が生成され、プロジェクト内でクラスのオートローディングが可能になります。
オートローディングの動作確認
最後に、プロジェクトのエントリポイントとなるindex.php
ファイルを作成し、クラスが正しくオートロードされるかを確認します。
<?php
require 'vendor/autoload.php';
use MyApp\Controllers\UserController;
use MyApp\Models\User;
$controller = new UserController();
$controller->showUser();
$user = new User();
echo $user->name;
これにより、UserController
クラスとUser
クラスが自動的にロードされ、出力結果としてユーザー情報が表示されます。
オートローディングを実際に設定することで、手動でクラスファイルをインクルードする煩雑さを解消し、コードを整理して管理しやすくすることができます。
名前空間を活用したプロジェクトの設計
名前空間は、プロジェクトの構造を効率的に設計し、管理を容易にするための強力なツールです。特に大規模プロジェクトでは、コードの可読性や保守性を向上させるために、名前空間を適切に活用することが重要です。
ディレクトリ構造と名前空間の設計
プロジェクトをモジュールごとに分割し、それぞれに対応する名前空間を設計することで、クラスが論理的にグループ化され、コードの管理が容易になります。例えば、MVC(Model-View-Controller)アーキテクチャを採用したプロジェクトの場合、以下のようにディレクトリ構造と名前空間を設定することが一般的です。
my_project/
└───src/
└───Controllers/
│ UserController.php
└───Models/
│ User.php
└───Views/
│ UserView.php
それぞれのクラスには、以下のような名前空間を設定します。
<?php
namespace MyApp\Controllers;
class UserController {
// コントローラーの処理
}
<?php
namespace MyApp\Models;
class User {
// モデルの処理
}
<?php
namespace MyApp\Views;
class UserView {
// ビューの処理
}
このように、クラスごとに異なる名前空間を付与し、それに対応したディレクトリ構造を構築することで、プロジェクトの規模が大きくなっても管理しやすくなります。
サードパーティライブラリとの統合
名前空間を使用することで、サードパーティライブラリとの統合もスムーズに行えます。多くのライブラリはPSR-4に準拠しており、同じ名前空間規約に従うため、ライブラリをプロジェクトに追加しても、名前の衝突を心配する必要がありません。
例えば、外部ライブラリをインストールし、Composerのオートローディングを使う場合、名前空間の構造が自動的に読み込まれるため、自分のコードとサードパーティのコードを簡単に区別できます。
リファクタリングの容易さ
名前空間を活用することで、クラスの再配置やモジュールの再編成が容易になります。クラス名が衝突することがないため、プロジェクトの一部を新しいモジュールに移動したり、再設計したりしても、既存のコードに大きな影響を与えずにリファクタリングできます。
適切な命名規則
名前空間を設計する際は、明確で一貫性のある命名規則を採用することが重要です。例えば、企業名やプロジェクト名を第一レベルの名前空間として使用し、機能やモジュールごとに階層化します。
例:
CompanyName\ProjectName\Controllers
CompanyName\ProjectName\Models
このように、名前空間を効果的に活用することで、プロジェクトが大規模で複雑になっても、コードの可読性と保守性を高く維持することができます。
オートローディングエラーのトラブルシューティング
オートローディングを使用していると、クラスが正しく読み込まれない場合やエラーが発生することがあります。こうしたエラーの原因を理解し、解決するためのトラブルシューティング方法を紹介します。
クラスが見つからないエラー
最も一般的なエラーの一つは、「クラスが見つからない」というエラーです。これは通常、オートローディングが正しく設定されていないか、クラスファイルのパスが正しくないことが原因です。
Fatal error: Uncaught Error: Class 'MyApp\Controllers\UserController' not found
原因1: クラスファイルのパスの誤り
PSR-4では、名前空間とディレクトリの構造が対応している必要があります。クラスの場所と名前空間が正しく対応しているか確認してください。たとえば、MyApp\Controllers\UserController
クラスがsrc/Controllers/UserController.php
に存在するかを確認します。
原因2: Composerのオートローダーが正しく生成されていない
Composerでオートローダーを生成する際に問題があった場合、クラスが正しくロードされません。再度オートローダーを生成するために、以下のコマンドを実行してみてください。
composer dump-autoload
これにより、オートローダーが再生成され、クラスのパスが正しく設定されることを確認できます。
名前空間のスペルミスや大文字小文字の違い
PHPでは名前空間が大文字小文字を区別します。そのため、クラスを呼び出す際に名前空間やクラス名のスペルが一致していない場合、エラーが発生します。例えば、以下のように、呼び出し側で名前空間の大文字小文字が異なるとエラーになります。
use Myapp\Controllers\UserController; // 誤り
use MyApp\Controllers\UserController; // 正しい
名前空間の定義やクラス名が正しく一致しているか確認してください。
オートローディングが機能しない原因
オートローディングが全く機能しない場合、いくつかの原因が考えられます。
原因1: `vendor/autoload.php`の読み込み漏れ
Composerのオートローダーを使用する場合、必ずプロジェクトのエントリポイント(例えばindex.php
)でvendor/autoload.php
を読み込む必要があります。
<?php
require 'vendor/autoload.php';
この記述が欠けていると、オートローディングが機能しませんので確認しましょう。
原因2: `composer.json`の設定ミス
composer.json
ファイルに記述したオートローディングの設定が間違っている場合、正しく動作しません。名前空間とディレクトリの対応が正しいか、再度確認してみてください。
{
"autoload": {
"psr-4": {
"MyApp\\": "src/"
}
}
}
デバッグ手法
オートローディングに関する問題をデバッグする際は、以下の方法が役立ちます。
- エラーメッセージの確認: エラーメッセージに表示されるクラス名やパスを確認し、手動でそのファイルが存在するか確認します。
composer dump-autoload -o
コマンド: オートローディングを最適化し、問題の原因を特定しやすくするため、オプティマイズされたオートローディングを生成します。
composer dump-autoload -o
これらのトラブルシューティング手法を活用して、オートローディングに関するエラーを迅速に解決しましょう。
実践例:大規模プロジェクトでの名前空間活用
大規模なPHPプロジェクトでは、名前空間とオートローディングの活用が特に重要です。ここでは、複数のモジュールや外部ライブラリが含まれるプロジェクトで、名前空間とオートローディングを効率的に使用する実践例を紹介します。
プロジェクトのモジュール化
大規模プロジェクトでは、コードを機能ごとにモジュールに分け、それぞれのモジュールに名前空間を割り当てることが推奨されます。例えば、ECサイトのプロジェクトでは、以下のようにモジュールごとに名前空間を設けます。
ecommerce_project/
└───src/
└───Controllers/
│ └───ProductController.php
└───Models/
│ └───Product.php
└───Services/
└───PaymentService.php
これに対応する名前空間の例は以下の通りです。
<?php
namespace Ecommerce\Controllers;
class ProductController {
// コントローラーの処理
}
<?php
namespace Ecommerce\Models;
class Product {
// モデルの処理
}
<?php
namespace Ecommerce\Services;
class PaymentService {
// サービスの処理
}
各機能ごとに名前空間を割り当てることで、クラスが機能別に整理され、コードの管理が容易になります。また、新しいモジュールの追加や既存機能の拡張がしやすくなります。
外部ライブラリとの統合
大規模プロジェクトでは、外部ライブラリを積極的に活用することが一般的です。例えば、支払い処理に関連するライブラリや、ログ管理のためのツールなどが必要になることがあります。
外部ライブラリを使用する場合、Composerを使用してプロジェクトにライブラリを追加します。多くのライブラリはPSR-4に準拠しているため、名前空間を通じて簡単に統合できます。以下は、Monologというログ管理ライブラリを追加する例です。
composer require monolog/monolog
次に、クラスを使用する際には、その名前空間をインポートして利用します。
<?php
require 'vendor/autoload.php';
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
$log = new Logger('name');
$log->pushHandler(new StreamHandler('app.log', Logger::WARNING));
$log->warning('This is a warning log message');
このように、外部ライブラリのクラスも名前空間によって整理されており、プロジェクト内で容易に利用できるようになっています。
サービスレイヤーの設計
大規模プロジェクトでは、サービスレイヤーを使用してビジネスロジックを分離することがよく行われます。サービスクラスに対して名前空間を割り当てることで、プロジェクトのロジック層を整理しやすくなります。例えば、以下のように支払い処理を担当するサービスクラスを設計します。
<?php
namespace Ecommerce\Services;
class PaymentService {
public function processPayment($order) {
// 支払い処理ロジック
}
}
このサービスクラスをコントローラーで利用する際には、名前空間を通じてインポートします。
<?php
namespace Ecommerce\Controllers;
use Ecommerce\Services\PaymentService;
class OrderController {
public function handleOrder() {
$paymentService = new PaymentService();
$paymentService->processPayment($order);
}
}
このように、名前空間を利用することで、サービスとコントローラー、モデルの役割が明確になり、コードの再利用性や保守性が向上します。
チーム開発と名前空間のメリット
大規模プロジェクトでは、複数の開発者が同時に作業することが一般的です。名前空間を活用することで、異なる開発者が同じプロジェクト内でクラスを開発しても名前の競合を防ぐことができます。これにより、チーム全体の作業効率が向上し、開発者間でのコード衝突が減少します。
運用環境でのオートローディング最適化
大規模プロジェクトでは、運用環境でのパフォーマンスも重要です。Composerのオートローディング機能には最適化オプションがあり、大量のクラスを効率的にロードできるようにすることが可能です。
composer dump-autoload --optimize
このコマンドを実行すると、Composerはクラスマップを生成し、クラスの読み込みが高速化されます。これにより、運用環境でのパフォーマンスが向上し、大規模プロジェクトでも効率的にクラスを管理できるようになります。
名前空間とオートローディングを適切に活用することで、大規模プロジェクトでもコードの整理やパフォーマンスの最適化が可能となり、効率的な開発を実現できます。
名前空間とオートローディングの応用例
名前空間とオートローディングは、基本的なクラスの読み込みだけでなく、より高度な応用や特殊なケースにも対応できます。ここでは、名前空間とオートローディングを活用したいくつかの応用例について紹介します。
自動的なクラスロードとプラグインシステム
大規模なアプリケーションやフレームワークでは、プラグインシステムやモジュールシステムを採用することが多くあります。名前空間とオートローディングを使うことで、こうしたシステムでプラグインやモジュールを自動的に読み込むことが容易になります。
例えば、WordPressのようなシステムでは、特定のフォルダにあるプラグインやモジュールを動的に読み込むことができます。以下は、各プラグインが自分自身の名前空間を持ち、Composerを使用して自動的に読み込まれるようにする例です。
plugins/
└───PluginA/
└───src/
└───PluginA.php
└───PluginB/
└───src/
└───PluginB.php
それぞれのプラグインには独自の名前空間を持たせ、次のようにオートローディングを設定します。
{
"autoload": {
"psr-4": {
"PluginA\\": "plugins/PluginA/src/",
"PluginB\\": "plugins/PluginB/src/"
}
}
}
これにより、アプリケーションが複数のプラグインを動的に管理できるようになり、拡張性が高まります。
オートローディングのカスタムロジック
場合によっては、標準のPSR-4では対応できないカスタムなローディングが必要になることもあります。例えば、特定のパターンに従ってクラスファイルをロードする場合や、特定のディレクトリ構造を動的に探しに行く場合です。
spl_autoload_register()
を使用してカスタムオートローダーを定義し、特定のロジックに基づいてクラスをロードすることが可能です。
spl_autoload_register(function ($class) {
// クラス名に基づいてカスタムディレクトリからロード
$prefix = 'CustomNamespace\\';
$base_dir = __DIR__ . '/custom_classes/';
// 名前空間のプレフィックスが一致するか確認
if (strpos($class, $prefix) === 0) {
// プレフィックスを取り除いてファイルパスを組み立てる
$relative_class = str_replace($prefix, '', $class);
$file = $base_dir . str_replace('\\', '/', $relative_class) . '.php';
// ファイルが存在すれば読み込む
if (file_exists($file)) {
require $file;
}
}
});
このようなカスタムオートローディングを使用することで、特定のニーズに合わせたクラスロードが可能になります。
高度なDIコンテナとの連携
名前空間とオートローディングは、依存性注入(DI)コンテナとも密接に関係しています。多くのPHPフレームワークでは、DIコンテナを使用してクラスの依存関係を自動的に解決し、必要なクラスを動的に注入する仕組みが用いられます。
例えば、Laravelのようなフレームワークでは、クラスを名前空間に基づいて自動的にオートロードし、DIコンテナがそのクラスのインスタンス化を行います。開発者は依存するクラスをコンストラクタで宣言するだけで、必要なオブジェクトが自動的に注入されます。
namespace App\Http\Controllers;
use App\Services\PaymentService;
class OrderController {
protected $paymentService;
public function __construct(PaymentService $paymentService) {
$this->paymentService = $paymentService;
}
public function handleOrder() {
$this->paymentService->processPayment($order);
}
}
ここでは、PaymentService
クラスがオートローディングによって自動的にロードされ、DIコンテナが依存関係を解決してインスタンス化しています。このような仕組みにより、オートローディングはDIコンテナと連携して、クラスの管理を効率化します。
動的クラスロードによるパフォーマンス最適化
大規模なプロジェクトでは、クラスが増えるとオートローディングの処理時間も増加する可能性があります。そのため、動的クラスロードの最適化が重要になります。Composerのクラスマップを使用することで、クラスを動的にロードする際のパフォーマンスを向上させることができます。
composer dump-autoload --optimize
このコマンドは、すべてのクラスファイルをクラスマップに登録し、クラスのロード速度を高速化します。特に本番環境では、最適化されたオートローディングがパフォーマンスに大きく寄与します。
名前空間のエイリアスを使用した柔軟な設計
名前空間のエイリアス機能を使用することで、クラスの使用をより柔軟にできます。例えば、長い名前空間を簡略化するためにuse
キーワードを使ってエイリアスを設定できます。
use MyApp\Services\PaymentService as PayService;
$service = new PayService();
$service->processPayment($order);
これにより、長い名前空間を持つクラスを簡潔に扱うことができ、コードの可読性が向上します。
名前空間とオートローディングの応用を活用することで、複雑なプロジェクトでもクラス管理が効率化され、柔軟かつ最適化された設計が可能となります。
クラスの自動読み込みとパフォーマンス最適化
オートローディングは、PHPプロジェクトの開発を効率化するための強力なツールですが、パフォーマンス面でも最適化が求められます。特に、大規模なプロジェクトではクラスの読み込みが増えるため、オートローディングのパフォーマンスを最適化することが重要です。
クラスマップを利用したオートローディングの最適化
Composerのオートローダーは、クラスが必要になるたびにファイルを検索して読み込むため、クラスが増えると処理時間が増加します。これを改善するために、Composerはクラスマップという機能を提供しています。クラスマップを利用すると、すべてのクラスとファイルの対応を事前に決定し、検索のオーバーヘッドをなくすことができます。
最適化されたクラスマップを生成するには、以下のコマンドを使用します。
composer dump-autoload --optimize
このコマンドにより、全てのクラスが1つのクラスマップにまとめられ、オートローディングが最適化されます。特に本番環境では、このオプションを使用することが推奨されます。
PSR-4とクラスマップの使い分け
通常の開発環境では、PSR-4のオートローディングを使うことで柔軟なクラスの自動読み込みが行われますが、本番環境ではクラスマップを使用してパフォーマンスを向上させることが一般的です。
- 開発環境: クラスファイルの追加や変更が頻繁に行われるため、PSR-4によるオートローディングが便利です。柔軟性を重視します。
- 本番環境: パフォーマンスが重要になるため、クラスマップを利用してロード速度を最適化します。
不要なクラスの自動読み込みを減らす
すべてのクラスがオートロードされる必要はありません。例えば、使用頻度の低いクラスや、特定のリクエストでしか使われないクラスは、必要になったときにのみロードされるように工夫することで、メモリ使用量や処理時間を削減できます。
クラスを適切にグループ化し、必要なクラスだけをロードすることで、プロジェクト全体の効率を向上させることが可能です。
オートローディングによるパフォーマンス最適化の効果
クラスの自動読み込みを最適化すると、以下のような効果が期待できます。
- ロード時間の短縮: クラスマップを使用することで、クラスを検索する時間を大幅に短縮できます。
- メモリ使用量の削減: 不要なクラスをロードしないように工夫することで、メモリの無駄遣いを防ぎます。
- アプリケーション全体のパフォーマンス向上: 特に大規模プロジェクトでは、クラスが増えるほど最適化の効果が顕著に表れます。
名前空間とオートローディングの効果的な組み合わせにより、開発の効率化だけでなく、パフォーマンスの最適化も同時に実現できます。適切な手法を用いることで、プロジェクトのスケーラビリティとパフォーマンスを確保しながら、柔軟なクラス管理を維持できます。
まとめ
本記事では、PHPの名前空間とオートローディングの基本から応用、そしてパフォーマンス最適化までを解説しました。名前空間を活用することで、クラスの競合を避け、コードを整理しやすくなります。Composerを用いたPSR-4準拠のオートローディングにより、効率的なクラスの管理が可能です。また、クラスマップによる最適化やカスタムオートローディングを活用すれば、パフォーマンスも向上させられます。これらの知識を活かし、スケーラブルでメンテナンス性の高いPHPプロジェクトを構築してください。
コメント