PHP 5.4以降を開発しやすくするための機能をアップデートするプロジェクトです。これは以下の人々の作業をもとにフォークされました。
- Turadg Aleahmad (Original Author)
- Aaron S. Hawley
- Lennart Borgman
- Eric James Michael Ritz
- Syohei Yoshida
リストアップされたすべての貢献者たちも同様にPHPモードを改善しました。
現在のメンテナ:
- USAMI Kenta (@zonuexe)
PHPモードのGitHubプロジェクトにissueを作成してバグ報告や機能リクエストを送ってください。或いはPHPのスイートのFeatHubページに機能リクエストを送ってもいいです。
PHPモードはEmacs 24.3以降で動作します。古いバージョンのEmacsでも動作するかもしれませんが、保証外です。 古いバージョンのEmacsのPHPモードを使用することによる問題のバグ報告は積極的に対応しません。
GNU Emacs 24以降では、package機能を使ってMELPAからPHPモードをインストールすることができます。 Marmaladeパッケージリポジトリには2004年のオリジナル版PHPモードしか登録されていません。そのため、MELPAを使用してPHPモードをインストールすることを推奨します。単にパッケージマネージャを使いたくない場合は、php-mode.el
ファイルをダウンロードしてload-path
の通ったディレクトリに配置し、必要に応じて (require 'php-mode)
をEmacsの設定に追加すると、PHPファイルを開くたびに自動的にPHPモードが有効になります。
さらにskeleton/php-ext.el
をload-path
に追加することでテンプレートを有効にすることができます。
(eval-after-load 'php-mode
'(require 'php-ext))
報告の際には M-x php-mode-debug
コマンドを実行して、その出力をバグレポートに含めてください。問題を再現するための手がかりになります。
.emacsファイル(~/.emacs.d/init.el
)にPHPモードでの設定を記述できます。
(defun my-php-mode-init ()
(setq-local show-trailing-whitespace t)
(setq-local ac-disable-faces '(font-lock-comment-face font-lock-string-face))
(setq-local page-delimiter "\\_<\\(class\\|function\\|namespace\\)\\_>.+$")
;; If you feel phumped and phpcs annoying, invalidate them.
(when (boundp 'flycheck-disabled-checkers)
(add-to-list 'flycheck-disabled-checkers 'php-phpmd)
(add-to-list 'flycheck-disabled-checkers 'php-phpcs)))
(add-hook 'php-mode-hook #'my-php-mode-init)
プロジェクトのトップディレクトリに.dir-locals.el
を記述すると、プロジェクト単位の設定を追加することができます。このファイルはユーザー自身のEmacsにインストールされたパッケージに依存するため、バージョン管理の対象に含めないことを推奨します。
((nil
(php-project-root . git)
(php-project-coding-style . psr2)))
In 2013 Daniel Haxney began rewriting parts of PHP Mode in terms of Emacs' built-in CC Mode. This laid the foundation for incorporating some of the inherit IDE-ish features of Emacs, such as CEDET, EDE, and Semantic. Support for these tools continues to improve thanks to the work of Andrea Turso, Steven Rémot, Joris Steyn, and others. If you wish to test, contribute to, or simply experiment with such features then this thread is a good place to start.
PHP7がリリースされました。PHPモードはPHP7からの以下の文法をサポートします。
- 返り値の型宣言
yield from
キーワードdeclare(strict_types=1)
宣言
現在のPHPモードはトレイト関連のinsteadof
などのPHP5.4で導入された新しいキーワードを構文強調表示します。また、従来のキーワードclone
やdefault
などもサポートします。
強調表示には公式のPHPマニュアルに記載があるすべてのマジック定数と定義済み定数が含まれます。ただし、特定の拡張機能の定数は現在のところ含みません。
トレイト、インターフェイス、名前空間がImenuリストに表示されるようになりました。フォント表示は名前空間でも正しく動作するようになり、namespace Foo\Bar\Baz
のようなコードはもはや警告されません。use <namespace> as <alias>
のような名前空間のエイリアスも同様です。現在のところエイリアス名はImenuのリストには含まれませんが、将来のバージョンでは対応予定です。
PHPモードは$foo_bar_baz
のような変数名の単語のそれぞれの部分を移動できるように、アンダースコア(_
)を「シンボル構成要素 (symbol constituents)」(Emacs用語)として取り扱います。
複数行にわたるメソッド呼び出しを->
の位置に揃えること(アライメント)ができます。
$object->foo()
->bar()
->baz();
この動作はデフォルトでは無効ですが、カスタマイズ変数 php-lineup-cascaded-calls
セットすることで有効化できます。
注意: アライメントは、PHPモードのコーディングスタイルのひとつを使用するか、それを継承した場合のみ機能します。
ネストされた関数呼び出しと array()
構文は現在デフォルトで(少くとも私の意見では)よく見えるようになりました。例として、このようなスタイルです:
$results = Post::model()->find(
array(
'select' => 'title',
'condition' => 'postID=:postID',
'params' => array(':postID' => 10),
)
);
以下のような無名関数
$greet = function($name) { ... };
これは現在、Imenuで$greet
として表示します。
カスタマイズ変数php-executable
をセットすることで、コーディング中に警告とエラーをリアルタイムで見るためにFlymakeモードを有効にすることができます。
コマンドC-c C-f
でカーソル位置のシンボルをPHP公式サイトのドキュメントから検索できます。また、ローカルにドキュメントをダウンロードしてあれば、それを優先します。php-manual-path
をセットするだけです。もしローカルで発見できなければPHPのWebサイトにフォールバックします。
php-send-region
コマンド(デフォルトではC-c C-r
)はリージョンで選択された範囲のPHPコードを実行します。C-x h
と組合せてコード全体を実行することもできます。出力は *PHP*
バッファに現れます。
PHPDocはJavaDocに似たドキュメンテーションの形式です。
@param
, @return
, @var
... などの表記はタグと呼ばれ、list of tags defined by phpDocumentor2で定義されます。 (これらのタグはPhpStormやPhanといった型チェッカーと互換性があります。)
アノテーションと呼ばれる記法は部分的にサポートしています。アノテーションの文法はタグとは少し異なり、@Annotation(attr1="vvv", attr2="zzz")
のような形式です。
SymfonyプロジェクトやGo! AOPなどいくつかのプロジェクト・フレームワークはDoctrine Annotationsの文法を元にしています。
/**
* Summary of Product class
*
* @copyright 2112 John Doe
* @license https://spdx.org/licenses/Apache-2.0.html Apache License 2.0
* @ORM\Entity
* @ORM\Table(name="product")
*/
class Product
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\Column(type="string", length=100)
*/
protected $name;
/**
* @ORM\Column(type="decimal", scale=2)
*/
protected $price;
/**
* @ORM\Column(type="text")
*/
protected $description;
}
アノテーションは @
から始まる行で、わかりやすく強調表示されます。ただしPHPモードはPSR-5: PHPDoc (草案)の完全なサポートは実装していません。我々は将来的にこれらの強調表示を厳密にサポートしたいと考えていますが、現在の実装は限定的です。詳しくは#478をご覧ください。
PHPモードはデフォルトではphp-enable-default-coding-style
関数で設定される合理的なインデントと整形スタイルを提供します。また、ほかの有用なコーディングスタイルも提供しているので、以下の関数を通じて設定することができます。
php-enable-pear-coding-style
php-enable-drupal-coding-style
php-enable-wordpress-coding-style
php-enable-symfony2-coding-style
php-enable-psr2-coding-style
M-x customize-group <RET> php
で‘PHP Mode Coding Style’を探してカスタマイズメニューを探して、デフォルトのコーディングスタイルの設定を有効化することができます。以下のように、コーディングスタイルごとにフックを有効化することもできます。
(add-hook 'php-mode-hook 'php-enable-default-coding-style)
このスタイルではメソッドチェーンのインデントの継続とぶらさがったセミコロンを整形できます。
$user1
->setCreateDate(new \DateTime('2007-05-07 01:34:45'))
->setLastDate(new \DateTime('2012-08-18 19:03:02'))
->setUsername('jay')
;
このスタイルはSymfony2のコードベースで広く利用されていますが、慣習についての文書で明示的に言及されているものではありません。
フレームワークによって一般的な定数群が定義されるならば、変数php-extra-constants
を値をカスタマイズすることができます。これはPHPモードが追加の定数として扱う定数名の文字列のリストです。これらの定数はPHP組み込みの定数と同じ強調表示を行います。
もしあなたがWeb Modeを使用しているなら、Web Modeに設定された追加のPHP定数をとキーワードを追加しようとします。
多くの開発者はPHPモードで純粋なPHPスクリプト(HTMLテンプレートを含まないもの)を編集します。HTMLとの互換レイヤーはPHPモードの歴史的な機能ですが、完全には機能していません。速度の低下や強調表示を破壊するおそれがあるなどの副作用があります。変数php-template-compatibility
をnil
にセットすると、HTMLとの互換性を無効化することができます。HTMLやその他のマークアップ言語のテンプレートエンジンを含むPHPスクリプトを開発する際はWeb Modeは優れた選択肢です。
GNU EmacsにはSubword Modeという機能があり、このマイナーモードはキャメルケースの部分を別の単語のように移動することができます。たとえば、PHPモードはデフォルトでは変数$fooBarBaz
を一つの単語として扱います。しかしSubword Modeを有効にすればEmacsはこの変数名を3つの単語として扱い、単語関係のコマンド(M-f
, M-b
, M-d
など)はカーソル位置のキャメルケースの各部分に影響します。
もしPHPファイルで常にSubword Modeを有効化したいならば、以下のように設定できます。
(add-hook 'php-mode-hook (lambda () (subword-mode 1)))
キーバインド C-c C-w
はSubword Modeのオンとオフを切り替えます。
Viewing and editing build scripts for Amaka will automatically enable PHP Mode.
(with-eval-after-load 'php-mode
(define-key php-mode-map (kbd "C-c C--") 'php-current-class)
(define-key php-mode-map (kbd "C-c C-=") 'php-current-namespace))
- 入力補完
- ac-php: company-mode and auto-complete for PHP
- 構文チェック
- flycheck: On the fly syntax checker
- flymake-php: flymake for PHP files
- スニペット
- php-auto-yasnippets: Dynamically Generated YASnippets for PHP Code
- ドキュメント
- テスト
- phpunit: phpunit test command tool
- コーディングスタイル
- phpcbf: PHP_CodeSniffer for Emacs
- Semantic
- ede-php-autoload: Semantic for PHP
- フレームワーク
PHPモードはどなたからの貢献も歓迎です。改善やバグ修正を行う前に以下の手順を行ってください。
- あなたの名前が
README.md
の“Contributors”のリストになければ追加してください。あなたの名前とGitHubアカウントや個人サイトをリンクして構いません。 - もし既にissueとして提起された問題に対処するならば、コミットメッセージに
GitHub-Issue: #16
のような行を含めてください。 php-mode.el
に影響する変更をした場合、php-mode-modified
定数を更新してください。テストやドキュメントのみの修正の場合は不要です。- しかし、
php-mode-version-number
は変更しないでください。メンテナがバージョンを決定します。 php-mode-test.el
を開いてすべてのテストを実行し、期待通りにテストを通過することを確認します。端末からmake test
で確認することもでき、git bisect run
と併用すると便利です。- GitHubからプルリクエストを送信します
- 可能な限り詳細なコミットメッセージを作成してください。不足するよりも冗長すぎる方が良いです。メンテナーのコミットを参照して、私たちが理想的だと期待するコミットメッセージの詳細度として参考にしてください。シンプルすぎるパッチだからと決めつけずにコミットメッセージを書けば、コード中にコメントを書かなくても将来の開発者がコミットの「理由」「経緯」を理解できるようになります。コミットメッセージには「なぜ」コミットを作成したか、「何を」解決するものなのかを記述することが重要です。メンテナーはほかの開発者のプルリクエストに詳細なコミットメッセージを書き込むことがありますが、常に一貫して行われるとは期待しないでください。
GitHubのissueに関連するバグを修正する場合: PHPモードの改善に協力いただきありがとうございます! tests/
ディレクトリには(すべてではありませんが)issueに関連のあるPHPスクリプトが配置されています。そこに予期される挙動と他のひとが動作を適切に確認できるテストコードを追加することを検討してください。そしてphp-mode-test.el
に既存のテストと同じようにERTを使ったテストコードを追加してください。
GitHubのプロジェクトページにはwikiがあり、自由に編集して構いません。このWikiには今後追加する計画のある機能やバグが掲載されています。また、PHPモードをより使いやすくするためのTipsを追加できます。
The “emacs-php” mailing list is a place to discuss PHP Mode as well as all other PHP-related packages for Emacs. You can find the mailing list at:
We encourage all users of PHP Mode and developers of any PHP-related packages to feel free to post anything there regarding PHP and Emacs.
PHP Mode uses the GNU General Public License 3.
PHPモードの改善に協力したすべての貢献者のリストはREADME.md#contributorsに掲載されています。