คู่มือการพัฒนา WordPress Plugin ฉบับสมบูรณ์: สร้าง PHP Plugin ระดับมืออาชีพตั้งแต่เริ่มต้น

อ่าน 3 นาที
2026-03-13
2026-06-05
2,029
I earn commissions when you shop through the links below, at no additional cost to you.

โครงสร้างพื้นฐานและไฟล์ของปลั๊กอิน WordPress

ปลั๊กอิน WordPress มาตรฐานอย่างน้อยต้องมีไฟล์หลักหนึ่งไฟล์ โดยไฟล์หลักนี้มักจะตั้งชื่อตามชื่อของปลั๊กอิน เช่น my-first-plugin.phpในส่วนต้นของไฟล์นี้ ต้องมีคอมเมนต์ส่วนหัวไฟล์เฉพาะ เพื่อประกาศข้อมูลเมตาของปลั๊กอินให้กับระบบ WordPress ข้อมูลเหล่านี้ประกอบด้วยชื่อปลั๊กอิน คำอธิบาย รุ่น ผู้พัฒนา เป็นต้น ซึ่งจะแสดงในหน้า “ปลั๊กอิน” ในการจัดการหลังบ้าน

นอกจากไฟล์หลักแล้ว ปลั๊กอินที่มีฟังก์ชันการทำงานครบถ้วนมักจะมีไดเรกทอรีและไฟล์อื่น ๆ เพื่อจัดระเบียบโค้ด โครงสร้างไดเรกทอรีทั่วไปรวมถึงสำหรับจัดเก็บไฟล์ CSS และ JavaScript/assetsไดเรกทอรีที่มีไฟล์คลาส PHP/includesไดเรกทอรีสำหรับเทมเพลตส่วนติดต่อผู้ใช้/templatesโครงสร้างแบบแยกส่วนนี้ช่วยในการบำรุงรักษาโค้ดและการทำงานร่วมกันเป็นทีม

ไฟล์หลักของปลั๊กอินเป็นจุดเริ่มต้นของฟังก์ชันการทำงานทั้งหมดของปลั๊กอิน นอกจากประกาศข้อมูลเมตาแล้ว หน้าที่หลักยังรวมถึงการลงทะเบียนฮุคการเปิดใช้งานและปิดใช้งาน การนำเข้าไฟล์ที่จำเป็น และการเริ่มต้นฟังก์ชันหลักของปลั๊กอิน ด้วยการจัดระเบียบไฟล์ที่เหมาะสม สามารถมั่นใจได้ว่าปลั๊กอินจะยังคงมีโครงสร้างที่ชัดเจนแม้ว่าฟังก์ชันการทำงานจะซับซ้อน

แนะนำให้อ่าน คู่มือเริ่มต้นการพัฒนา WordPress Plugin

สร้างปลั๊กอินพื้นฐานแรกของคุณ

เรามาเริ่มต้นด้วยการสร้างปลั๊กอิน “Hello World” ที่เรียบง่ายที่สุด เพื่อทำความคุ้นเคยกับขั้นตอนการสร้างและวงจรชีวิตพื้นฐานของปลั๊กอิน

UltaHost WordPress โฮสติ้ง
การรับประกันคืนเงินภายใน 30 วัน, แบนด์วิธและฐานข้อมูลไม่จำกัด, การป้องกัน DDoS ฟรี, ซื้อ 3 ปีลดราคา 50%

กำหนดข้อมูลปลั๊กอินและฟังก์ชันหลัก

ขั้นแรก ในไดเรกทอรีการติดตั้ง WordPress ในเครื่องของคุณที่/wp-content/plugins/เส้นทาง สร้างโฟลเดอร์ใหม่และตั้งชื่อว่า “hello-world” ภายในโฟลเดอร์นั้น สร้างไฟล์ชื่อhello-world.phpของไฟล์

ในตอนเริ่มต้นของไฟล์นี้ คุณจำเป็นต้องเพิ่มข้อมูลส่วนหัวของปลั๊กอิน ส่วนหัวของปลั๊กอินทั่วไปมีลักษณะดังนี้:

<?php
/**
 * Plugin Name:       你好世界示例插件
 * Plugin URI:        https://yourwebsite.com/hello-world
 * Description:       这是一个用于演示的简单WordPress插件。
 * Version:           1.0.0
 * Author:            你的名字
 * Author URI:        https://yourwebsite.com
 * License:           GPL v2 or later
 * Text Domain:       hello-world
 * Domain Path:       /languages
 */

ต่อไป เราจะเพิ่มฟังก์ชันพื้นฐานให้กับปลั๊กอินนี้: เพิ่มข้อความอัตโนมัติที่ส่วนท้ายของเนื้อหาบทความ เราสามารถทำได้ผ่านthe_contentตัวกรอง หลังจากข้อมูลส่วนหัวของไฟล์หลักแล้ว ให้เพิ่มโค้ดต่อไปนี้:

function hello_world_add_footer_text( $content ) {
    // 仅在单篇文章页面添加
    if ( is_single() ) {
        $footer_text = '<p><em>บทความนี้สร้างขึ้นโดยปลั๊กอิน “Hello World”</em></p>';
        $content .= $footer_text;
    }
    return $content;
}
add_filter( 'the_content', 'hello_world_add_footer_text' );

จัดการการเปิดใช้งานและปิดใช้งานปลั๊กอิน

ปลั๊กอินระดับมืออาชีพควรจัดการตรรกะการเปิดใช้งานและการปิดใช้งานอย่างเหมาะสม ตัวอย่างเช่น เมื่อเปิดใช้งานปลั๊กอินอาจจำเป็นต้องสร้างตารางฐานข้อมูลหรือตั้งค่าตัวเลือกเริ่มต้น; เมื่อปิดใช้งานอาจจำเป็นต้องล้างข้อมูลชั่วคราว เราใช้register_activation_hookregister_deactivation_hookฟังก์ชันเพื่อลงทะเบียน hook ที่เกี่ยวข้อง

แนะนำให้อ่าน การพัฒนา WordPress Plugin จากเริ่มต้นจนเชี่ยวชาญ: การสร้างฟังก์ชันที่กำหนดเองและการขยายประสิทธิภาพสูง

เพิ่มโค้ดต่อไปนี้ในไฟล์หลัก:

// 插件激活时执行的操作
function hello_world_activate() {
    // 例如:添加一个选项到数据库
    if ( ! get_option( 'hello_world_installed' ) ) {
        add_option( 'hello_world_installed', time() );
    }
    // 可以在这里刷新固定链接规则,以确保新注册的URL结构生效
    flush_rewrite_rules();
}
register_activation_hook( __FILE__, 'hello_world_activate' );

// 插件停用时执行的操作
function hello_world_deactivate() {
    // 例如:删除我们创建的临时选项(谨慎操作,用户数据通常不删除)
    // delete_option( 'hello_world_installed' );
    // 清理重写规则
    flush_rewrite_rules();
}
register_deactivation_hook( __FILE__, 'hello_world_deactivate' );

หลังจากทำตามขั้นตอนข้างต้นแล้ว คุณจะสามารถมองเห็นและเปิดใช้งาน “ปลั๊กอินตัวอย่าง Hello World” ได้ในหน้า “ปลั๊กอิน” ของแอดมิน WordPress หลังจากเปิดใช้งานแล้ว เมื่อเข้าชมบทความใด ๆ คุณจะเห็นข้อความที่เพิ่มเข้ามาที่ด้านล่างของเนื้อหา

ใช้ WordPress Core API เพื่อเพิ่มประสิทธิภาพ

WordPress มี API ที่หลากหลายอย่างยิ่ง ทำให้ผู้พัฒนาปลั๊กอินสามารถโต้ตอบกับระบบหลักได้อย่างปลอดภัยและเป็นมาตรฐาน การเข้าใจ API เหล่านี้เป็นกุญแจสำคัญในการพัฒนาเชิงมืออาชีพ

hosting.com 共享主机
高性能,配备 AMD EPYC CPU、NVMe SSD 存储和 LiteSpeed,全天候24小时、全天候的专家内部支持,高级安全措施,包括 SSL、暴力破解、恶意软件和 DDoS 防护,节省高达 73%

การใช้ Action Hooks และ Filters

Action Hooks อนุญาตให้คุณ “แทรก” และรันโค้ดของคุณเองในจุดเวลาที่กำหนด ตัวอย่างเช่น เมื่อบทความถูกเผยแพร่ WordPress จะเรียกใช้save_postaction คุณสามารถเชื่อมต่อฟังก์ชันของคุณเองกับ hook นี้ได้ผ่านทางฟังก์ชันadd_action()ฟังก์ชันจะติดตั้งฟังก์ชันของตัวเองลงบนฮุคนี้

function hello_world_on_post_publish( $post_id, $post, $update ) {
    // 检查是否不是修订版本,并且是发布操作
    if ( wp_is_post_revision( $post_id ) || $post->post_status != 'publish' ) {
        return;
    }
    // 发送邮件通知或执行其他逻辑
    // wp_mail( '[email protected]', '新文章已发布', '文章标题:' . $post->post_title );
}
add_action( 'save_post', 'hello_world_on_post_publish', 10, 3 );

ตัวกรองฮุค (Filter Hooks) อนุญาตให้คุณปรับเปลี่ยนข้อมูล ตัวอย่างที่the_contentกล่าวมาก่อนหน้านี้เป็นกรณีการใช้งานตัวกรองทั่วไป อีกตัวอย่างที่พบบ่อยคือการปรับเปลี่ยนหัวข้อบทความ:

function hello_world_modify_title( $title ) {
    return '【推荐】' . $title;
}
// add_filter( 'the_title', 'hello_world_modify_title' ); // 谨慎使用,这会修改所有标题

สร้างเมนูการจัดการและหน้าตัวเลือก

ปลั๊กอินหลายตัวต้องการอินเทอร์เฟซหลังบ้านเพื่อกำหนดค่าการตั้งค่า WordPress มีฟังก์ชันที่ช่วยเพิ่มเมนูระดับบนสุดหรือเมนูย่อยไปยังหลังบ้านการจัดการได้อย่างง่ายดาย

แนะนำให้อ่าน เรียนรู้การพัฒนา WordPress Plugin: สร้างโมดูลฟังก์ชันที่กำหนดเองที่มีประสิทธิภาพตั้งแต่เริ่มต้น

โค้ดด้านล่างสาธิตวิธีการเพิ่มหน้าตัวเลือกอย่างง่าย และใช้ WordPress Settings API เพื่อบันทึกตัวเลือกอย่างปลอดภัย

// 步骤1:向管理后台添加一个菜单项
function hello_world_add_admin_menu() {
    add_menu_page(
        '你好世界设置',       // 页面标题
        '你好世界插件',       // 菜单标题
        'manage_options',     // 所需权限
        'hello-world-settings', // 菜单slug
        'hello_world_settings_page', // 用于渲染页面的回调函数
        'dashicons-admin-generic', // 图标(可选)
        80                    // 菜单位置
    );
}
add_action( ‘admin_menu‘, ‘hello_world_add_admin_menu’ );

// 步骤2:定义设置页面的HTML内容
function hello_world_settings_page() {
    ?&gt;
    <div class="”wrap”">
        <h1>การตั้งค่าปลั๊กอิน Hello World</h1>
        <form method="”post”" action="/th/”options.php”/" data-trp-original-action="”options.php”">
            <?php
                settings_fields( ‘hello_world_settings_group’ ); // 输出设置字段和非ce字段
                do_settings_sections( ‘hello-world-settings’ ); // 输出设置部分
                submit_button(); // 输出提交按钮
            ?>
        <input type="hidden" name="trp-form-language" value="th"/></form>
    </div>
    &lt;?php
}

// 步骤3:注册设置、字段和章节
function hello_world_settings_init() {
    // 注册一个新的设置项到“hello_world_settings_group”组
    register_setting( ‘hello_world_settings_group’, ‘hello_world_custom_message’ );

// 在页面中新增一个章节
    add_settings_section(
        ‘hello_world_settings_section’,
        ‘自定义消息设置’,
        ‘hello_world_settings_section_callback’,
        ‘hello-world-settings‘
    );

// 向章节中添加一个字段
    add_settings_field(
        ‘hello_world_message_field’,
        ‘前台显示的消息’,
        ‘hello_world_message_field_render’,
        ‘hello-world-settings’,
        ‘hello_world_settings_section’
    );
}
add_action( ‘admin_init’, ‘hello_world_settings_init’ );

// 章节描述的回调函数
function hello_world_settings_section_callback() {
    echo ‘<p>กำหนดค่าข้อความที่จะแสดงที่หน้าเว็บสำหรับปลั๊กอินที่นี่</p>’;
}

// 字段渲染的回调函数
function hello_world_message_field_render() {
    $option = get_option( ‘hello_world_custom_message’, ‘这是默认消息’ );
    echo ‘<input type="”text”" name="”hello_world_custom_message”" value="”‘" . esc_attr( $option ) ‘“ size ="”40”" />’;
}

ด้วยโค้ดด้านบน คุณได้สร้างหน้าตั้งค่าที่เป็นไปตามมาตรฐานของ WordPress และสามารถบันทึกข้อมูลได้อย่างปลอดภัยในแบ็กเอนด์

โฮสติ้งแบบแชร์ของ InterServer
共享主机每月 $2.50 USD , 首月 $0.1 USD 优惠码 tryinterserver, 461个云应用脚本,一键安装。

ปลั๊กอินความปลอดภัย ประสิทธิภาพ และการเตรียมการเผยแพร่

ก่อนที่จะแชร์ปลั๊กอินให้ผู้อื่นใช้หรือส่งไปยังไดเรกทอรีอย่างเป็นทางการ การทำให้แน่ใจว่าปลอดภัย มีประสิทธิภาพ และใช้งานง่ายเป็นสิ่งสำคัญ

ปฏิบัติตามแนวทางปฏิบัติที่ดีที่สุดด้านความปลอดภัย

ความปลอดภัยเป็นสิ่งสำคัญอันดับแรกในการพัฒนาปลั๊กอิน หลักการแรกคือ: อย่าเชื่อถือข้อมูลที่ผู้ใช้ป้อนเข้ามา ข้อมูลทั้งหมดที่มาจากผู้ใช้หรือแหล่งภายนอก (เช่น$_GET$_POST$_COOKIE) ต้องได้รับการตรวจสอบ ทำความสะอาด หรือหลีกหนีก่อนที่จะนำไปใช้ในการสืบค้นฐานข้อมูล แสดงผลบนหน้าเว็บ หรือดำเนินการคำสั่งระบบ

สำหรับเนื้อหาที่แสดงผลเป็น HTML ให้ใช้esc_html()esc_attr()wp_kses_post()เพื่อหลีกหนีอักขระ

echo ‘<div class="”“‘" . esc_attr( $user_provided_class ) ‘“>’ . esc_html(เนื้อหาที่ผู้ใช้ให้มา) . ‘</div>’;

สำหรับการสืบค้นฐานข้อมูล อย่าเชื่อมตัวแปรโดยตรงกับคำสั่ง SQL อย่างเด็ดขาด ต้องใช้$wpdb->prepare()วิธีการประมวลผลล่วงหน้า

global $wpdb;
$user_id = 123;
$query = $wpdb->prepare(
    “SELECT * FROM {$wpdb->prefix}my_table WHERE user_id = %d”,
    $user_id
);
$results = $wpdb->get_results( $query );

นอกจากนี้ ฟังก์ชัน callback ทุกฟังก์ชันที่ผู้ใช้สามารถเข้าถึงได้ (ไม่ว่าจะเป็น AJAX ด้านหน้า หรือการดำเนินการด้านหลัง) ต้องใช้current_user_can()check_ajax_referer()ฟังก์ชันเพื่อตรวจสอบสิทธิ์และความปลอดภัย

ปรับปรุงประสิทธิภาพของปลั๊กอิน

ปลั๊กอินที่มีประสิทธิภาพต่ำอาจส่งผลต่อประสบการณ์ของผู้ใช้ทั้งเว็บไซต์ การปรับปรุงสามารถทำได้หลายด้าน: ใช้แคชอย่างเหมาะสม, หลีกเลี่ยงการสืบค้นฐานข้อมูลที่ซับซ้อนหรือการเรียกใช้ API ระยะไกลทุกครั้งที่โหลดหน้าเว็บ WordPress มี Transient API(Transients API)ซึ่งสามารถจัดเก็บข้อมูลชั่วคราวได้อย่างสะดวก

// 尝试从缓存获取数据
$data = get_transient( ‘my_plugin_expensive_data’ );
if ( false === $data ) {
    // 缓存中没有,执行昂贵操作
    $data = expensive_database_query();
    // 将结果缓存12小时
    set_transient( ‘my_plugin_expensive_data’, $data, 12 * HOUR_IN_SECONDS );
}

ประการที่สอง ตรวจสอบให้แน่ใจว่าไฟล์ CSS และ JavaScript โหลดเฉพาะในหน้าที่ต้องการ ผ่านwp_enqueue_script()wp_enqueue_style()ฟังก์ชันสามารถควบคุมการโหลดทรัพยากรและความสัมพันธ์การพึ่งพาอย่างแม่นยำ สำหรับทรัพยากรแบ็กเอนด์ สามารถติดตั้งไว้ที่admin_enqueue_scriptsฮุก; สำหรับทรัพยากรฟรอนต์เอนด์ ให้ติดตั้งไว้ที่wp_enqueue_scriptsฮุก

เตรียมพร้อมสำหรับการทำให้เป็นสากลและการเผยแพร่

เพื่อให้ปลั๊กอินสามารถใช้งานได้โดยผู้ใช้ทั่วโลก การทำให้เป็นสากล (i18n) เป็นขั้นตอนที่ขาดไม่ได้ ซึ่งหมายความว่าคุณจะต้องห่อหุ้มสตริงทั้งหมดที่หันหน้าไปทางผู้ใช้ด้วยฟังก์ชันเฉพาะ

แปลสตริงในปลั๊กอินจาก:

echo “Hello World!”;

เป็น:

echo __( ‘Hello World!’, ‘hello-world’ );

ที่ซึ่ง‘hello-world’คือสิ่งที่คุณกำหนดไว้ในส่วนหัวของปลั๊กอินText Domainจากนั้นคุณสามารถใช้เครื่องมือเช่น Poedit เพื่อสร้าง.potไฟล์เทมเพลต ซึ่งนักแปลสามารถใช้สร้าง.po.moไฟล์ นำไฟล์แปลเหล่านี้ไปวางไว้ในส่วนหัวของปลั๊กอินDomain Pathในไดเรกทอรีที่ระบุ (เช่น/languages) ด้านล่าง

ก่อนที่จะเผยแพร่ โปรดเขียนไฟล์readme.txtอย่างละเอียด โดยรูปแบบต้องเป็นไปตามข้อกำหนดอย่างเป็นทางการของ WordPress ประกอบด้วยคำอธิบายปลั๊กอิน ขั้นตอนการติดตั้ง คำถามที่พบบ่อย ฯลฯ นี่เป็นข้อกำหนดบังคับสำหรับการส่งไปยังไดเรกทอรีปลั๊กอินของ WordPress พร้อมกันนี้ ให้เพิ่มคำอธิบาย PHP Doc อย่างละเอียดในโค้ดปลั๊กอิน ซึ่งไม่เพียงช่วยให้ผู้อื่นเข้าใจโค้ดของคุณ แต่ยังแสดงถึงความเป็นมืออาชีพอีกด้วย

สรุป

บทความนี้นำเสนอขั้นตอนการพัฒนา WordPress Plugin แบบมืออาชีพตั้งแต่เริ่มต้นอย่างเป็นระบบ เราเริ่มจากทำความเข้าใจโครงสร้างพื้นฐานของปลั๊กอิน จากนั้นลงมือสร้างปลั๊กอินแรกที่เรียบง่ายซึ่งมีตรรกะการเปิดใช้งาน/ปิดใช้งาน ต่อมาได้เจาะลึกระบบฮุคแอ็กชันและฟิลเตอร์อันทรงพลังของ WordPress และวิธีใช้เพื่อบูรณาการกับระบบหลักอย่างลึกซึ้ง พร้อมทั้งสร้างหน้าตั้งค่าผู้ดูแลมาตรฐาน สุดท้ายเราได้เน้นย้ำถึงมาตรฐานความปลอดภัยที่ขาดไม่ได้ในการพัฒนาปลั๊กอิน วิธีการเพิ่มประสิทธิภาพ และการเตรียมความพร้อมสำหรับการเผยแพร่สู่ทั่วโลก (Internationalization) การเรียนรู้ทักษะและความรู้หลักเหล่านี้จะทำให้คุณสามารถสร้าง WordPress Plugin ระดับมืออาชีพที่ปลอดภัย มีประสิทธิภาพ และบำรุงรักษาง่าย จากที่ตอบสนองความต้องการส่วนบุคคลไปสู่การบริการผู้ใช้กลุ่มที่กว้างขึ้น

คำถามที่พบบ่อย (FAQ)

การพัฒนา WordPress Plugin ต้องมีความรู้พื้นฐานอะไรบ้าง?

การพัฒนา WordPress Plugin อย่างแรกต้องมีพื้นฐานการเขียนโปรแกรม PHP ที่แข็งแกร่ง เนื่องจากโค้ดของปลั๊กอินส่วนใหญ่ประกอบด้วย PHP พร้อมกันนี้ต้องมีความเข้าใจพื้นฐานเกี่ยวกับ HTML, CSS และ JavaScript เพื่อจัดการการแสดงผลและปฏิสัมพันธ์ส่วนหน้า สิ่งสำคัญที่สุดคือต้องคุ้นเคยกับแนวคิดหลักของ WordPress เช่น ฮุค (Hooks), ชอร์ตโค้ด (Shortcodes), ประเภทบทความที่กำหนดเอง (CPT) และคลาสการทำงานกับฐานข้อมูล$wpdbการใช้

วิธีการดีบั๊ก WordPress ปลั๊กอินที่กำลังพัฒนาอยู่?

วิธีการดีบักที่มีประสิทธิภาพคือการเปิดใช้งานโหมดWP_DEBUGของ WordPress ในwp-config.phpในไฟล์, ตั้งค่าdefine( ‘WP_DEBUG’, false );เปลี่ยนเป็นdefine( ‘WP_DEBUG’, true );คุณยังสามารถเปิดใช้งานพร้อมกันได้WP_DEBUG_LOGบันทึกข้อผิดพลาดลงในไฟล์บันทึก หรือเปิดใช้งานWP_DEBUG_DISPLAYของคุณแสดงข้อผิดพลาดบนหน้า (เฉพาะในสภาพแวดล้อมการพัฒนา) นอกจากนี้ การใช้เครื่องมือนักพัฒนาของเบราว์เซอร์ (Console, แท็บ Network) เป็นสิ่งจำเป็นสำหรับการดีบัก JavaScript ด้านหน้าและคำขอ AJAX

ปลั๊กอินของฉันทำงานร่วมกับปลั๊กอินอื่นได้อย่างไร?

กุญแจสำคัญในการรับประกันความเข้ากันได้ที่ดีคือการปฏิบัติตามมาตรฐานการเข้ารหัสของ WordPress และใช้ตัวแปรและชื่อฟังก์ชันทั่วโลกอย่างระมัดระวัง การเพิ่มคำนำหน้าที่ไม่ซ้ำใครให้กับฟังก์ชัน คลาส และค่าคงที่ของปลั๊กอินของคุณเป็นวิธีปฏิบัติที่ดีที่สุดในการหลีกเลี่ยงความขัดแย้งของชื่อ เช่น การใช้myplugin_หรือตัวย่อของนักพัฒนาเป็นคำนำหน้า เมื่อทำการแก้ไขที่อาจเกี่ยวข้องกับปลั๊กอินอื่น (เช่น เนื้อหา หัวเรื่อง) ตรวจสอบให้แน่ใจว่าฟังก์ชันเรียกกลับตัวกรองของคุณมีความสำคัญที่เหมาะสม (พารามิเตอร์ที่สามของadd_filter) และให้ความสนใจกับรูปแบบค่าที่ส่งคืน นอกจากนี้ ควรใช้อย่างเหมาะสมclass_exists()function_exists()เพื่อตรวจสอบว่าคลาสหรือฟังก์ชันใดๆ ถูกกำหนดไว้หรือไม่ สามารถทำการโหลดแบบมีเงื่อนไขหรือให้ทางเลือกสำรองได้

จำเป็นต้องเข้าใจการเขียนโปรแกรมเชิงวัตถุ (OOP) เพื่อพัฒนาโปรแกรมเสริมหรือไม่?

虽然使用传统的面向过程编程方式也可以开发功能完整的插件,但强烈推荐学习和使用面向对象编程(OOP)。OOP能够更好地组织代码,通过类(Class)来封装功能,提高代码的可复用性和可维护性。对于中大型插件项目,使用OOP结合命名空间(Namespaces)和自动加载(Autoloading)是行业内的标准做法,它能让你更清晰地区分不同模块,并显著降低代码的耦合度。