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

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

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

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

Q&A

解決済

2回答

541閲覧

PHPで関数の読み方処理が分からないので教えてください

ehsb5arj0

総合スコア11

PHP

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

0グッド

1クリップ

投稿2022/10/04 14:07

WordPressのテーマCocoonのコメント機能をカスタムしたいのですが
コピペより自分で少しは中身を理解しようと思い、PHPとHTML、CSSの入門書に目を通し、
Cocoonのcomments.phpを一行ずつググったりVSCodeでWordPressのフォルダのソースコードの文字を検索して処理を追って何が書いてあるのか調べているのですが

該当のソースコード

PHP

1//コメントの見出し 2<?php 3define('OP_COMMENT_HEADING', 'comment_heading'); 4if ( !function_exists( 'get_comment_heading' ) ): 5function get_comment_heading(){ 6 return stripslashes_deep(get_theme_option(OP_COMMENT_HEADING, __( 'コメント', THEME_NAME ))); 7} 8endif;

上記の部分のソースコードの処理の流れで
定数OP_COMMENT_HEADINGを文字列comment_headingと定義。
もし、関数get_comment_headingが定義済みではない場合関数get_comment_headingを定義。
という所までは読めたのですが関数の中身の
return stripslashes_deep(get_theme_option(OP_COMMENT_HEADING, ( 'コメント', THEME_NAME )));
の部分が、stripslashes_deepが値からスラッシュを削除する関数、get_theme_optionがオプションの値をデータベースから取得する関数、OP_COMMENT_HEADINGは中身が'comment_heading'の定数、
(は THEME_NAMEに対応する翻訳データを使って'コメント'の部分を翻訳する関数ということは分かったのですが
丸括弧が何重にもなっていて入門書や学習サイトにもこういうサンプルは載っていなくていまいち理解できません。

質問1
関数get_comment_headingは
戻り値に関数stripslashes_deepを返す
関数stripslashes_deepは引数として、関数get_theme_optionを持っていて
関数get_theme_optionは引数として、定数OP_COMMENT_HEADINGと関数 __(を持っていて
関数 __(は引数として'コメント'と THEME_NAMEを持っている
という解釈で合っているのでしょうか?

質問2
こういうプログラムの場合処理の流れは
一番内側の括弧の関数から処理していけば良いのですか?

質問3
こういう引数に使われている物の中にさらに引数があって丸括弧が何重にも連なっているのは良くあることなのですか?またそういう文に特別な呼び方があったりするのでしょうか?

よろしくお願いいたします

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

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

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

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

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

guest

回答2

0

関数get_comment_headingは戻り値に関数stripslashes_deepを返す

違います。stripslashes_deepを呼んで、その返り値を返します。関数そのものではありません。

関数stripslashes_deepは引数として、関数get_theme_optionを持っていて

これも同じで、stripslashes_deepの引数になっているのはget_theme_optionの返り値です。

質問2

はい、PHPにおける関数の呼び出しは、「関数の引数評価」→「関数実行」→「結果を返す」という流れで進んでいきます。つまり、関数を呼び出すカッコの中身を先に処理してから関数が呼ばれます。

こういう引数に使われている物の中にさらに引数があって丸括弧が何重にも連なっているのは良くあることなのですか?

はい。ただし、あまり複雑すぎると読みづらいので一時変数に受けることもあります。

投稿2022/10/04 14:26

編集2022/10/04 14:31
maisumakun

総合スコア145183

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

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

ehsb5arj0

2022/10/05 05:02

わかりやすく説明していただき助かりました ありがとうございます
guest

0

ベストアンサー

丸括弧が何重にもなっていて入門書や学習サイトにもこういうサンプルは載っていなくていまいち理解できません。

こういう場合は処理を切り出す…ではないですけど意味を一つずつ読めばいいかと。

PHP

1function get_comment_heading(){ 2 return stripslashes_deep(get_theme_option(OP_COMMENT_HEADING, __( 'コメント', THEME_NAME ))); 3}

は、関数を複数呼んでいます。そういう場合は内側から読みます。

数学だと1 + (2 - 3) × 4のような感じでしょうか。
優先順位としてカッコが先で次に掛け算や割り算、最後に足し算と引き算ですよね。
まず(2 - 3)を計算してノートかどこかに結果を記録しておく。この記録を X とする。
次に掛け算を計算する。よってX × 4 = -1 × 4 = -4なのでX = -4に更新する。
最後に足し算をする。…とやる。

これと同じように先に内側の処理から先に計算していく。
今回のコードでは一番内側の処理はget_theme_option(OP_COMMENT_HEADIN, __( 'コメント', THEME_NAME )ですね。なのでこれを処理する。
でも第二引数は関数…のようですね。なのでこっちから計算しないといけない。

恥ずかしながら__(...)という表記法がわからなかったので『php "__()" function』でggるとPHP: What does __('Some text') do?

In Kohana (version 3) the function is defined in system/base.php and is a convenience function to aid (as the other answers have mentioned) internationalization. You provide a string (with, optionally, some placeholders to substitute values into the finished text) which is then interpreted and, if required, a translation is returned.
[概訳]:
Kohana version 3の system/base.phpで提供されている利便性のいい関数の一つで多言語化するための関数である。(クライアント側の)言語に翻訳する。

とあるので日本語、英語、スペイン語…という風に翻訳してくれるものって感じですね。

THEME_NAME は…生のPHPでは無いようなのでよくわかりません。
ただ何となく『クライアント側の言語で』とかみたいな指定だろうと推測。

つまり、『"コメント"を英語なら"comment", 日本語なら"コメント"と言う風に変換したものを取得』とかだと思います。
その結果を仮に$textに入れるとすると$text = __( 'コメント', THEME_NAME )となります。
これの結果が仮に"コメント"だとする。
次にget_theme_option関数に渡すことになる。
よってget_theme_option( OP_COMMENT_HEADING, $text )となる。
OP_COMMENT_HEADINGはその上で定義されている定数なので本来のデータを入れてみる。$textに関しては"コメント"とかの値。これらの引数をもとにget_theme_option関数が呼ばれる。

get_theme_optionがオプションの値をデータベースから取得する関数

とあるので、先ほど計算した結果のOP_COMMENT_HEADINGと"コメント"でデータベースから取得する。
これの結果を$commentTextとすると $commentTextにデータベースから取得したデータが入ることになる。
この$commentTextをstripslashes_deep関数に渡して処理してもらう。

このstripslashes_deep関数は

stripslashes_deepが値からスラッシュを削除する関数

らしいので『スラッシュを省く』という処理をすることになる。

つまり今までの処理を並べると、

[Flow] 1. 多言語化した『コメント』という文字列を取得(英語ならcommentとか) 2. OP_COMMENT_HEADINGと(1)を使ってデータベースから取ってくる 3. (2)で取得したデータからスラッシュを省く

ということは、『その現地の"コメント"に相当する単語で登録されているカラムのデータをDBから取ってきて、スラッシュが含まれていない状態にする』です。
そしてその結果をreturnで返しているだけですね。

細かい部分はご自分で調べてください。

質問1:
上記をもとに考えてみてください。

質問2:
上記の説明の通り、『YES』。

質問3:
よくある…かどうかわかりませんが簡略化するときは割とやっているイメージですね。
ただ可読性が悪くなりやすいので普通はその都度変数に入れてやると思いますが。
名称はないと思いますよ。単に計算して戻り値を引数として渡しているだけなので。

投稿2022/10/05 04:03

BeatStar

総合スコア4958

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

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

ehsb5arj0

2022/10/05 05:05

ありがとうございます 詳しく噛み砕いて教えていただき大変参考になりました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問