word press plugin開発にオートロードを使ってみた話

Post on 13-Apr-2017

112 Views

Category:

Engineering

3 Downloads

Preview:

Click to see full reader

TRANSCRIPT

WordPress Plugin 開発にオートロードを使ってみた話2016/12/11 Tomoyuki Sugita

杉田 知至@tomotomobile

クックビズ株式会社開発部マネージャProject ManagerWP Campaign Manager作者

自己紹介

“ 趣味で”WordPress プラグインを開発して公開しています

キャンペーン管理が驚くほどカンタンにhttps://wordpress.org/plugins-wp/wp-campaign-manager/

記事の途中に唐突に出てくるバナーを管理するためのプラグインです。アフィリエイターさん必見!

バナーはショートコードで管理しているため、元のコードを修正すれば、サイト内の全バナーを差し替えできます。

キャンペーンを非公開にすれば、記事内のバナーも非表示になります。バナーの予約投稿も可。

実際に自分で使ってみて不便だと思ったこと

アフィリエイトの支払い条件とか、キャンペーン期間が分からないので、詳細 URLが欲しい。

こういう枠を管理画面に追加するとコード量が一気に増える。

管理画面の機能、ショートコードの機能などを別のファイル(クラス)に分けたくなる。

Require 地獄は嫌だ!

require_once __DIR__ . 'src/AdminTheme.php';require_once __DIR__ . 'src/ShortCode.php';

オートロード使いたい!

use tomotomobile\WPCampaignManager\AdminTheme;use tomotomobile\WPCampaignManager\ShortCode;

PHP のオートロードの紹介わかり易さ優先で雑に解説

PHP で別ファイルにあるクラスを使いたいとき# wp-campaign-mager.phpで、 src/ShortCode.phpを使いたいときrequire_once 'src/ShortCode.php';

# src/AdminTheme.phpで、 src/ShortCode.phpを使いたいときrequire_once './ShortCode.php';

※分かりやすくするため、変な書き方してます

require いっぱい使うと面倒くさい!実行速度も遅くなる!

そこで使うのが PHP5.3 から登場したオートロード

PHP で別ファイルにあるクラスを使いたいとき# wp-campaign-mager.phpで、 src/ShortCode.phpを使いたいときuse src\ShortCode;

# src/AdminTheme.phpで、 src/ShortCode.phpを使いたいときuse src\ShortCode;

※分かりやすくするため、変な書き方してます

さっきの書き方# wp-campaign-mager.phpで、 src/ShortCode.phpを使いたいときrequire_once 'src/ShortCode.php';

# src/AdminTheme.phpで、 src/ShortCode.phpを使いたいときrequire_once './ShortCode.php';

※分かりやすくするため、変な書き方してます

オートロード使ったときの書き方# wp-campaign-mager.phpで、 src/ShortCode.phpを使いたいときuse src\ShortCode;

# src/AdminTheme.phpで、 src/ShortCode.phpを使いたいときuse src\ShortCode;

※分かりやすくするため、変な書き方してます

注意点require_once 'src/ShortCode.php';  ↓use src\ShortCode;

スラッシュ (/)がバックスラッシュ (\)に変わりました。.phpが無くなりました。

src/ShortCode.php を少し改造<?phpnamespace src;

class ShortCode {

※ファイルの先頭に一行追加

ネームスペースといいますuse src\ShortCode;

て書いたら、 src/ShortCode.phpのクラスを呼び出します。

ネームスペースは何でも OK

<?phpnamespace tomotomobile\WPCampaignManager;

class ShortCode {

※PSR-4のルールですが説明は省略

use の後ろはネームスペースuse tomotomobile\WPCampaignManager\ShortCode;

て書いたら、 src/ShortCode.phpのクラスを呼び出します。

さっきのuse src\ShortCode;

て書いたら、 src/ShortCode.phpのクラスを呼び出します。

今回のuse tomotomobile\WPCampaignManager\ShortCode;

て書いたら、 src/ShortCode.phpのクラスを呼び出します。

利点• いっぱい requireしなくて良い• requireの速度が早くなる(たいてい)• クラス名が短くて済む

余談終わり!

解決策 1Composer 使えばいいじゃん

確かにできる!require_once __DIR__ . '/vendor/autoload.php';

use tomotomobile\WPCampaignManager\AdminTheme;use tomotomobile\WPCampaignManager\ShortCode;

$instance = new WPCampaignManager();$instance->execute();

composer.pharって 1.7MBもあるんだぜ。オートロード使いたいだけなのに、はっきり言ってオーバースペック。

解決策 2Autoloader 自分で作っちゃえ

できちゃった!require_once __DIR__ . '/autoloader.php';

use tomotomobile\WPCampaignManager\AdminTheme;use tomotomobile\WPCampaignManager\ShortCode;

$instance = new WPCampaignManager();$instance->execute();

さっきのrequire_once __DIR__ . '/vendor/autoload.php';

use tomotomobile\WPCampaignManager\AdminTheme;use tomotomobile\WPCampaignManager\ShortCode;

$instance = new WPCampaignManager();$instance->execute();

今回のrequire_once __DIR__ . '/autoloader.php';

use tomotomobile\WPCampaignManager\AdminTheme;use tomotomobile\WPCampaignManager\ShortCode;

$instance = new WPCampaignManager();$instance->execute();

元のコード

作った (?)コード

変更点$prefix = 'Foo\\Bar\\';  ↓$prefix = 'tomotomobile\\WPCampaignManager\\';

自分で決めたネームスペースを書くだけ。バックスラッシュ (\)は 2回書きます。

まとめレガシーコードの集合体WordPressにも、オートロードを実装できることが分かりました!

ご清聴ありがとうございました

Appendix

参考サイト• Example Implementations of PSR-4

https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader-examples.md

• PHPでクラスの includeを自動化する autoloadの速度を測ってみた。http://blog.katty.in/1942

• Composerhttps://getcomposer.org/

top related