This module adds support for PHP 5.3+ (including PHP7).
- ctags-based code completion (
company-phpandphpctags) - eldoc support (
ac-phpandphp-extras) - REPL (
php-boris) - Code refactoring commands (
php-refactor-mode) - Unit-test commands (
phpunit) - Support for
laravelandcomposerprojects (with project-specific snippets) - Shortcuts for composer commands
- File templates
- Snippets
PHP was the first programming language I got paid to code in, back in the Cretaceous period (2003). My sincerest apologies go out to all the programmers who inherited my earliest PHP work. I know you’re out there, writhing in your straitjackets.
Save a programmer today. Stop a friend from choosing PHP as their first language.
This module has no dedicated maintainers.
+hackAdd support for the Hack dialect of PHP by Facebook.+lspEnable LSP support through phpactor or intelephense. Requires the:tools lspmodule and the phpactor server to be installed on your system.
- async
- php-boris
- php-extras
- php-mode
- php-refactor-mode
- phpunit
- composer.el
+hack+lsp:editor format
To get started with PHP, you’ll need php (5.3+) and composer.
Note for +lsp:
- In order to make full use of phpactor server,
php(7.3+) is recommended. - If you use intelephense,
nodeandnpmare needed.
PHP 5.5 comes prepackaged with newer versions of MacOS. These instructions are provided for reference:
brew tap homebrew/homebrew-php
brew install php71 # or php53, php54, php55
brew install composer
# If you use intelephense:
brew install node
brew install npmsudo pacman --needed --noconfirm -S php composer # or php53, php54, php55
# If you use intelephense:
sudo pacman -S nodejs npmsudo zypper install php-composer
# If you use intelephense:
sudo zypper install nodejs npmThis module has no required dependencies, but it has a couple optional ones.
boris(REPL)phpctags(better code completion)phpunit(unit test commands)php-cs-fixerand@prettier/plugin-php(for code formatting)phpactor(for LSP if intelephense isn’t desired)
composer global require \
d11wtq/boris \
phpunit/phpunit \
techlivezheng/phpctags \
friendsofphp/php-cs-fixer \
phpactor/phpactor
# Needed by php-cs-fixer, otherwise you'll get "Couldn't resolve parser
# 'php'" errors
npm install -g @prettier/plugin-phpYou must ensure that ~~/.composer/vendor/bin~ is in PATH, so these executables are
visible to Emacs:
# place this in your profile file, like ~/.bash_profile or ~/.zshenv
export PATH="~/.composer/vendor/bin:$PATH"You may also need to regenerate your envvar file by running doom env on the
command line.
NOTE phpactor doesn’t have to be installed via composer, just has to exist in
your $PATH.
There are a number of currently supported LSP servers:
- Intelephense (Recommended)
- phpactor
- Serenata
- felixbecker (Considered unsupported)
Intelephense is currently the only server that supports automatic installation,
which will trigger either when you open a PHP project or manually invoke
lsp-install-server through M-x.
The others have to be installed manually and added to your $PATH.
This module provides an interface to PHPUnit through a number of commands as
detailed below. By default, it loads configuration from the root phpunit.xml.
phpunit-current-projectLaunch all tests for the projectphpunit-current-classLaunch all tests for the current class/fixturephpunit-current-testLaunch the current test at point
If for some reason, the default phpunit.xml is in a different location (or you
use the phpunit.xml.dist convention) , the path can be changed via
phpunit-configuration-file
(setq phpunit-configuration-file "phpunit.xml")This module provides several convenience methods for triggering composer commands:
| Binding | Function |
|---|---|
<localleader> m c c | composer |
<localleader> m c i | composer-install |
<localleader> m c r | composer-require |
<localleader> m c u | composer-update |
<localleader> m c d | composer-dump-autoload |
<localleader> m c s | composer-run-scripts |
<localleader> m c v | composer-run-vendor-bin-command |
<localleader> m c o | composer-find-json-file |
<localleader> m c l | composer-view-lock-file |
These are all invokable via M-x too.
A lot of projects rely on running inside docker compose (ie Laravel), and as
such a minor mode has been configured to attempt to run tests inside the php-fpm
(by default) container.
This mode is disabled by default, to opt-in set +php-run-tests-in-docker to t in
your config. If this is done during Emacs running, you will also have to reload
php-mode (i.e. through M-x php-mode)
If you wish to specify a different container, modify the
+php-default-docker-container variable (ideally inside a .dir-locals.el file)
((php-mode . ((+php-default-docker-container . "php-octane"))))Unfortunately, intelephense currently operates under a “freemium” model, and as such requires a license for extended features. Once purchased, this can be (insecurely) added directly to your config:
(setq lsp-intelephense-licence-key "<key>")A more recommended approach would be to utilise Emacs’ own auth-sources for
storing authentication info, which can also be encrypted.
Create a file in your home directory (which can optionally be encrypted, verify
your auth-sources has the correct values) called ~~/.authinfo~
machine * login intelephense password <key>
And add the following to your config
(defun my-fetch-password (&rest params)
(require 'auth-source)
(let ((match (car (apply #'auth-source-search params))))
(if match
(let ((secret (plist-get match :secret)))
(if (functionp secret)
(funcall secret)
secret))
(error "Password not found for %S" params))))
(setq lsp-intelephense-license-key (my-fetch-password :user intelephense))