ホームページ  >  記事  >  バックエンド開発  >  関数型プログラミングを発見する: WordPress プラグイン開発への道

関数型プログラミングを発見する: WordPress プラグイン開発への道

WBOY
WBOYオリジナル
2023-08-30 13:37:081397ブラウズ

探索函数式编程:开发 WordPress 插件的途径

このシリーズの第 2 部では、WordPress プラグインを作成するときに使用できる 2 つの異なるプログラミング スタイル (プログラミング パラダイムと呼ばれることもあります) について説明します。第 1 部では、Tom McFarlin がオブジェクト指向プログラミングを紹介します。このパートでは、関数型プログラミングについて説明します。

読者の経験レベルには個人差があるため、高度なプログラミングについて説明しますが、初心者でも問題ありません。ただし、経験豊富な開発者であれば、この記事の後半でさらに役立つ情報が見つかる可能性があります。


関数型プログラミングとは何ですか?

関数型プログラミングはおそらくあなたが最もよく知っているスタイルであり、ほぼ普遍的に使用されており、インターネット上のさまざまな WordPress スニペット サイトで使用されているスタイルです。したがって、これは「入門レベル」プログラミング、つまりオブジェクト指向プログラミングを習得する前に初心者が採用するスタイルとみなされることもあります。関数型プログラミングははるかに単純ですが、本質的に劣っているわけではないため、これは非常に誤解を招きます。

関数型プログラミングは関数の評価を重視し、状態やオブジェクトの概念を避けます。オブジェクト指向プログラミングとは対照的です。オブジェクト指向プログラミングでは、メソッドを使用してオブジェクトに作用し、オブジェクトを変更したりオブジェクトと対話したりするものとしてコードを考えることが奨励されます。これら 2 つのスタイルを比較するための非常に簡単な例を見てみましょう:

リーリー

この非常に単純な例は、2 つのパラダイム間のスタイルの基本的な違いを示しています。関数型プログラミングは、パラメーターを関数に渡し、関数から値を受け取ることに重点を置いています。作用されるのは「オブジェクト」ではなく、パラメータと戻り値だけです。対照的に、オブジェクト指向のアプローチでは、さまざまなプロパティ (この場合は「値」) がオブジェクトに割り当てられ、メソッドはこれらのプロパティに基づいて動作します。


機能: 基本

関数の定義は非常に簡単です:

リーリー

関数を宣言すると、その関数はプラグイン内のどこでも使用できます。つまり、関数はグローバル スコープになります。

リーリー 関数には一意の名前が必要です。関数を再宣言するとエラーがスローされます。コードは他のプラグイン、テーマ、WordPress 自体で実行されるため、一般的な名前を使用しないでください。代わりに、関数名 (プラグインの名前など) に固有のプレフィックスを追加する必要があります。

add の定義で、2 番目のパラメーターが 1 に設定されていることにお気づきかもしれません。これにより、$number2 のデフォルト値 (この場合は 1) が設定され、パラメータがオプションになります。引数が指定されていない場合、値はデフォルトとして扱われます:

リーリー

一方、最初の値にはデフォルト値が提供されていないため、このパラメータを省略するとエラーが発生します

リーリー

パラメータの数を可変にすることもできます。関数内で func_num_args() を使用すると、受信した引数の数を取得できます。また、func_get_arg() を使用すると、0 から始まるインデックスが付けられた特定の渡された変数にアクセスできます。

リーリー

上記の内容はオブジェクトメソッドでも使用できます。最後に、変数を「グローバル」として宣言すると、関数内から変数にアクセスできるようになります。

リーリー グローバル変数の使用は一般に推奨されません。特に、2 つのプラグインがグローバル変数に同じ名前を使用すると、一方または両方のプラグインが壊れる可能性があります。グローバル変数を使用する必要がある場合は、プラグイン名をプレフィックスとして付けて、グローバル変数が一意であることを再度確認してください。

関数型プログラミングを使用する理由

どのプログラミング スタイルを使用するかは、最終的には判断と個人的な好みによって決まります。オブジェクト指向プログラミングの代わりに関数型プログラミングを使用することが正しいか間違っているかということはありませんが、通常は、達成したいことにより適したスタイルがあります。

オブジェクト指向プログラミングがまったく必要なく、物事が過度に複雑になったり、冗長なコードが導入されたりするだけの場合があります。例としては、WordPress が提供するさまざまな「ユーティリティ」機能が挙げられます。これらは、特定の目的を実行するために使用される一般的な関数です。たとえば、 wp_trim_words( $text, $num_words ) は、指定された文字列を特定のサイズ (単語単位) にトリミングするだけです。 wp_trim_words() を何らかのオブジェクトに属するメソッドとして定義するために何も追加せず、より醜いコードになります。関数型プログラミングの場合は 1 行だけです。

関数型プログラミングの利点の 1 つは、特に初心者にとってそのシンプルさです。静的関数、プライベート関数、または保護された関数について心配する必要はありません。これらはすべてグローバルです。静的変数という概念も存在しません。最も基本的なレベルでは、関数は与えられたものから派生した出力を返します。たとえば、get_the_title( 7 ) は ID 7 の投稿のタイトルを返します。

関数型プログラミングのもう 1 つの利点は、関数にグローバルにアクセスできることです。オブジェクト指向プログラムの場合、特定のオブジェクトを操作するには、そのオブジェクトを渡す必要があります。これは難しい場合もあります。これを説明するために、パート 1 の例を見てみましょう:

class DemoPlugin {
	public function __construct() {
		add_action( 'wp_enqueue_scripts', array( $this, 'register_plugin_scripts' ) );
	}

	public function register_plugin_scripts() {
		// Register plugin scripts
	}
}
$demo_plugin = new DemoPlugin();

当 WordPress 存储 register_plugin_scripts() 方法时,以便在触发 wp_enqueue_scripts 操作时调用它,它不仅通过引用该方法,而且还引用对象 $demo_plugin 来实现此目的。这是因为同一对象的不同实例的相同方法被视为不同的方法 - 即 $demo_plugin->register_plugin_scripts()$copy_of_demo_plugin->register_plugin_scripts() 不是相同。这可能看起来很奇怪 - 但对于同一类的不同实例,方法的行为可能不同,因此我们需要引用方法和实例。

但是为什么这很重要呢?这使得第三方插件或主题很难取消该方法,因为为此他们需要调用:

	remove_action( 'wp_enqueue_scripts', array( $demo_plugin, 'register_plugin_scripts' ) );

但通常他们无法访问 $demo_plugin 变量。 (注意:如果该方法被声明为静态,那么您可以解决这个问题)。


WordPress 中的面向对象和函数式编程

当然,面向对象编程有其优点,如第一部分所述。正如 Tom 还提到的,使用 WordPress 的小部件 API 时这是不可避免的。另一个常见的例子是 WP_Query()。在这里,面向对象的方法显然是最好的:您有一个对象(在本例中是一个查询),它具有各种属性(即搜索条件、分页信息、匹配结果),并且您想要对该查询进行操作(解析它,生成并清理相应的SQL,并返回结果)。

WP_Query() 演示了正确使用时面向对象编程的强大功能。发起查询后:

$the_query = new WP_Query( array(...) );

您不仅可以访问结果,还可以访问其他信息,例如分页值:有多少页结果、正在查看哪个页面、结果总数以及查询的“类型”,例如$the_query->is_search()$the_query->is_single() 等。还有整个“循环”基础设施;

	if ( $the_query->have_posts() ) {
		echo '<ul>';
		while( $the_query->have_posts() ): $the_query->the_post();
			// The Loop
			echo '<li>' . get_the_title( $the_post->ID ) . '</li>';
		endwhile;
		echo '</ul>';
	}
	wp_reset_postdata();

它将结果和全局变量的所有内部处理隐藏在人性化的 API 后面。

那么 get_posts() 呢?这只是作为 WP_Query() 的包装器,并简单地返回与查询匹配的帖子数组。因此,您不会得到 WP_Query() 的“花哨”功能,但它的效率稍高一些。因此,是否应该使用 get_posts() 还是 WP_Query() 取决于您的用例(例如,是否需要分页),但这也取决于个人喜好。

	$results = get_posts( array( ... ) );

	if ( $results ) {
		echo '<ul>';
		foreach( $results as $the_post ) {
			echo '<li>' . get_the_title( $the_post->ID ) . '</li>';
		}
		echo '</ul>';
	}

摘要

希望这两篇文章有助于突出这些编程风格的优点和缺点。要点是,这里没有对与错,每个程序员都有自己的个人偏好。但某些上下文更容易适应某种编程风格 - 因此您应该期望您的插件包含两者的混合。

以上が関数型プログラミングを発見する: WordPress プラグイン開発への道の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。