質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

4回答

2203閲覧

function_existsを楽に使いたい

hana_hana

総合スコア27

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2019/08/13 23:18

編集2019/08/13 23:23

WordPressでプラグイン依存の関数を使うとき、function_existsを使いますよね。

そのときに、普通にifを書くのが面倒だと感じたのですが、下記のような感じで楽に使うことはできませんでしょうか?

↓普通にifを書く

if ( function_exists( 'new_my_func1' ) ) { new_my_func1(); } if ( function_exists( 'new_my_func2' ) ) { new_my_func2(); }

↓楽かなと思う書き方(の案)

function ex( $func ){ if ( function_exists( $func ) ) { $func; } } ex( new_my_func1() ); ex( new_my_func2() );

しかしこれでは引数をどうするんだという話もあってダメなのですが、このようなイメージで巧い方法がございましたら教えてください。宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

ex( new_my_func1() );

引数もそうですが、こう書いた場合、new_my_func1の実行結果をexの引数として実行する
と解釈できます。そのため、お望み結果を得られません。

CHERRYさんのいう通り、第一パラメーラに関数名(文字列として)を与え、第二引数以降に可変変数を利用し
call_user_func_arrayで処理すればできなくはないと思いますが

見た目は概ね以下のようになります

ex('new_my_func1', $arg1, $arg2)

が、変数スコープとか変わると思うので結果微妙だと思います

投稿2019/08/14 00:04

mikkame

総合スコア5036

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hana_hana

2019/08/15 10:42

たしかに、そうならざるをえなそうですね。ありがとうございます。
guest

0

そもそも論になりますが…
その関数がなかったらニッチもサッチもいかないんだったら
最初にチェックしておく方がいいと思いますし、
関数名を配列にしといてループでチェックするなら
if 文はひとつで済みますし、
無ければ実行しなくていいやって話なら
フラグ立てといて判断すれば
多少短くなる…
とは思いますが、それがご希望に沿えるかどうかは、ね。

php

1$func_list = ['new_my_func1','new_my_func2']; 2foreach ($func_list as $func_name) { 3 if (function_exists($func_name)) { 4 //エラー処理 or フラグ立て 5 } 6} 7 8//(中略) 9 10if (フラグ) new_my_func1();

っていうか、バグ対策ですよね?
ならデバッグで対応するのがスジだと思いますが
違ったら申し訳ないです。

投稿2019/08/14 12:08

takasima20

総合スコア7458

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KazuhiroHatano

2019/08/15 03:19

WPは管理画面でユーザーが簡単にプラグインの停止などができるし、何か問題が起きたらまずプラグインを停止してみるというのが一般的なトラブル対応の手順なので、もしプラグインを停止してもFatal Errorにならないようにするために、プラグイン依存の処理はFail Safeにしておくのがお作法
hana_hana

2019/08/15 10:42

ありがとうございます。
takasima20

2019/08/15 13:44

KazuhiroHatanoさん、フォローありがとうございます。
guest

0

第1パラメータを関数名、第2パラメータ以降に引数として、可変変数 を利用して関数を実行すればできたりするかなと思ったけど試したことはないなぁ。

投稿2019/08/13 23:44

編集2019/08/13 23:45
CHERRY

総合スコア25171

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hana_hana

2019/08/15 10:42

ありがとうございます。
guest

0

『テーマのテンプレートからプラグインで定義されている関数を呼び出したいけど、プラグインが有効化されていない場合にもCall to undefined functionとならないようにしたい、でもfunction_existsを毎回書くのは面倒だ』というのであれば、functions.php で何もしない関数として同名の関数を定義しておいて、その関数をそのまま呼び出すというのは一つの手かと思います。

php

1if ( ! function_exists( 'new_my_func1' ) ) { 2 function new_my_func1(/* 引数は元の関数と合わせる */) {} 3}

投稿2019/08/14 05:18

YukiYamashina

総合スコア1011

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mikkame

2019/08/14 05:23 編集

読み込み順でプラグインより先にロードした時に意図しない動作をすると思います
YukiYamashina

2019/08/14 05:33

'after_setup_theme'以降のアクション/フィルターでフックさせた関数内で定義されてるとダメですね。
hana_hana

2019/08/15 10:41

現実的ですね。ありがとうございます。mikkame様もご忠告ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問