Bahagian dua siri ini melihat dua gaya pengaturcaraan berbeza (kadangkala dipanggil paradigma pengaturcaraan) yang boleh anda gunakan semasa menulis pemalam WordPress. Dalam Bahagian Satu, Tom McFarlin memperkenalkan pengaturcaraan berorientasikan objek. Dalam bahagian ini, kita akan membincangkan pengaturcaraan berfungsi.
Memandangkan tahap pengalaman pembaca berbeza-beza, kami akan membincangkan pengaturcaraan lanjutan, jadi jika anda seorang pemula, anda sepatutnya tiada masalah. Walau bagaimanapun, jika anda seorang pembangun yang berpengalaman, anda mungkin mendapat lebih banyak maklumat berguna kemudian dalam artikel ini.
Pengaturcaraan fungsional mungkin gaya yang paling anda kenali, dan hampir digunakan secara universal dan merupakan gaya yang digunakan oleh pelbagai tapak coretan WordPress di internet. Oleh itu, kadangkala boleh dianggap pengaturcaraan "peringkat permulaan": gaya yang digunakan oleh pemula sebelum mereka belajar menguasai pengaturcaraan berorientasikan objek. Ini amat mengelirukan, kerana walaupun pengaturcaraan berfungsi jauh lebih mudah, ia tidak semestinya lebih rendah.
Pengaturcaraan fungsian menekankan penilaian fungsi dan mengelakkan konsep keadaan atau objek, berbanding pengaturcaraan berorientasikan objek, yang menggalakkan pemikiran kod sebagai bertindak pada objek, menggunakan kaedah untuk menukar objek tersebut atau berinteraksi dengannya. Mari lihat contoh yang sangat mudah untuk membandingkan dua gaya ini:
// Functional method function add_two( $n ) { return $n +2; } $a = 2; $b = add_two( $a ); // $b = 4; // Object oriented method class Number { var $value = 0; function __construct( $a ) { $this->value = $a; } function add_two() { $this->value = $this->value +2; } } $a = new Number( 2 ); echo $a->value; //Prints 2 $a->add_two(); echo $a->value; //Prints 4
Contoh yang sangat mudah ini menggambarkan perbezaan asas dalam gaya antara dua paradigma: Pengaturcaraan fungsional memfokuskan pada menghantar parameter kepada fungsi dan menerima nilai daripada fungsi. Tiada "objek" yang diambil tindakan, hanya parameter dan nilai pulangan. Sebaliknya, pendekatan berorientasikan objek memberikan pelbagai sifat (dalam kes kami, "nilai") kepada objek, dan kaedah bertindak pada sifat ini.
Mentakrifkan fungsi adalah sangat mudah:
function add( $number, $number2 = 1 ) { // Perform code acting on passed variables $sum = $number + $number2; // Optional, if needed you can return a value return $sum; }
Selepas anda mengisytiharkan fungsi, ia boleh digunakan di mana-mana sahaja dalam pemalam - dengan kata lain, ia mempunyai skop global.
$a = 4; $b = 7; echo add( $a, $b ); // Prints 11
Anda mungkin perasan bahawa dalam takrifan add
, parameter kedua ditetapkan sama dengan 1
. Ini menetapkan nilai lalai untuk $number2
(dalam kes ini 1), dengan itu menjadikan parameter sebagai pilihan. Jika tiada hujah diberikan, nilai akan dianggap sebagai lalai: add
的定义中,第二个参数设置为等于 1
。这为 $number2
设置默认值(在本例中为 1),这样就使参数成为可选的。如果未提供参数,则该值将被视为默认值:
echo add( 4 ); // Prints 5 echo add( 4, 1 ); // Prints 5
另一方面,没有为第一个值提供默认值,因此省略该参数将引发错误
echo add(); // Throws an error as $number is not defined
您还可以拥有可变数量的参数。在函数内部,我们可以使用 func_num_args()
来获取收到的参数数量,而 func_get_arg()
允许您访问特定的传递变量,索引从 0 开始。
function sum() { // Get the number of arguments given to sum() $number_args = func_num_args(); $sum = 0; if ( ! $number_args ) return $sum; for ( $i = 0; $i < $number_args; $i++ ) { $sum += func_get_arg( $i ); } return $sum; } echo sum( 1, 2, 3, 4 ); //Prints 10 echo sum( 1, 2 ); //Prints 3 echo sum(); //Prints 0
上面的内容也可以用在对象方法中。最后,通过将变量声明为“全局”,您可以从函数内部访问该变量。
$a = 'Hello'; $b = 'World'; function hello_world() { // This is necessary to access $a and $b // declared outside of the function scope. global $a, $b; $b = $a . ' ' . $b; } hello_world(); echo $b; // Prints 'Hello World'
决定使用哪种编程风格取决于判断 - 是的 - 个人喜好。使用函数式编程而不是面向对象编程并没有更正确或更错误的说法,但通常情况下,有一种风格更适合您想要实现的目标。
有时面向对象编程根本没有必要,只会使事情变得过于复杂,或者引入多余的代码。一个例子可能是 WordPress 提供的各种“实用”功能。这些是用于执行特定目的的通用函数。例如 wp_trim_words( $text, $num_words )
只是将给定的字符串修剪到一定的大小(以单词为单位)。它不会添加任何内容来将 wp_trim_words()
定义为属于某个对象的方法,并且会导致更丑陋的代码。对于函数式编程,只需一行。
函数式编程的一个优点是它的简单性,特别是对于初学者来说。您不必担心静态、私有或受保护的函数 - 它们都是全局的。静态变量的概念也不存在。在最基本的层面上,你的函数返回一个从你给它的内容派生的输出。例如, get_the_title( 7 )
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();
remove_action( 'wp_enqueue_scripts', array( $demo_plugin, 'register_plugin_scripts' ) );
func_num_args()
untuk mendapatkan bilangan hujah yang diterima, manakala func_get_arg()
membenarkan anda mengakses pembolehubah lulus tertentu, diindeks bermula dari 0. 🎜
$the_query = new WP_Query( array(...) );
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();
wp_trim_words( $text, $num_words )
hanya memangkas rentetan yang diberikan kepada saiz tertentu (dalam perkataan). Ia tidak menambah apa-apa untuk mentakrifkan wp_trim_words()
sebagai kaedah yang dimiliki oleh sesetengah objek dan menghasilkan kod yang lebih hodoh. Untuk pengaturcaraan berfungsi, hanya satu baris. 🎜
🎜Salah satu kelebihan pengaturcaraan berfungsi ialah kesederhanaannya, terutamanya untuk pemula. Anda tidak perlu risau tentang fungsi statik, peribadi atau dilindungi - semuanya bersifat global. Konsep pembolehubah statik juga tidak wujud. Pada tahap paling asas, fungsi anda mengembalikan output yang diperoleh daripada apa yang anda berikan. Contohnya, get_the_title( 7 )
akan mengembalikan tajuk siaran dengan ID 7. 🎜
🎜Satu lagi kelebihan pengaturcaraan berfungsi ialah fungsi boleh diakses secara global. Untuk program berorientasikan objek, untuk beroperasi pada objek tertentu, anda perlu lulus objek tersebut. Ini kadang-kadang boleh menjadi rumit. Untuk menggambarkan ini, mari kita ambil contoh dari bahagian satu: 🎜
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
变量。 (注意:如果该方法被声明为静态,那么您可以解决这个问题)。
当然,面向对象编程有其优点,如第一部分所述。正如 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>'; }
希望这两篇文章有助于突出这些编程风格的优点和缺点。要点是,这里没有对与错,每个程序员都有自己的个人偏好。但某些上下文更容易适应某种编程风格 - 因此您应该期望您的插件包含两者的混合。
Atas ialah kandungan terperinci Temui Pengaturcaraan Berfungsi: Laluan untuk Membangunkan Pemalam WordPress. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!