ฟังก์ชั่นเดียว. php หรือแยกเป็นไฟล์ขนาดเล็กจำนวนมาก?


14

ฉันกำลังสร้างกรอบงานง่าย ๆ พร้อมตัวเลือกชุดรูปแบบ ฉันแบ่งส่วนของรหัสภายในfunctions.phpและวางไว้ในโครงสร้างโฟลเดอร์เฉพาะ

ตอนนี้ในfunctions.phpไฟล์หลักของฉันฉันมีเพียงการrequire_onceโทรไปยังไฟล์เหล่านี้

แต่เพื่อเหตุผลของการโต้แย้ง - สมมติว่าฉันจะลงท้ายด้วย 20 ไฟล์ที่จะรวม

คำถาม:

  1. สิ่งนี้มีผลต่อประสิทธิภาพ WP ในลักษณะที่มองเห็นได้หรือไม่?
  2. จะดีกว่าหรือเปล่าที่จะเก็บทุกอย่างไว้ในไฟล์ 1 ไฟล์ (functions.php)
  3. วิธีที่ดีที่สุดที่จะไปเกี่ยวกับเรื่องนี้คืออะไร?

ขอบคุณ

คำตอบ:


12

1.สิ่งนี้มีผลต่อประสิทธิภาพ WP ในลักษณะที่มองเห็นได้หรือไม่?

หากมันจะมีผลกระทบจริงสำหรับไฟล์ขนาดเล็กบางไฟล์ก็จะมีผลกระทบที่มีผลกระทบต่ำกว่า WP: PHP และประสิทธิภาพของเซิร์ฟเวอร์ มันมีผลกระทบจริงๆเหรอ? ไม่ได้จริงๆ แต่คุณยังสามารถเริ่มทำการทดสอบประสิทธิภาพได้ด้วยตัวเอง

2.จะดีกว่าไหมถ้าเก็บทุกอย่างไว้ใน 1 ไฟล์ (functions.php)

ตอนนี้คำถามคือ "มีอะไรดีกว่า" จากเวลาโหลดไฟล์โดยรวม? จากมุมมองขององค์กรไฟล์หรือไม่ อย่างไรก็ตามมันไม่ได้สร้างความแตกต่าง ทำไปในทางที่ทำให้คุณไม่ต้องเสียภาพรวมและสามารถรักษาผลลัพธ์ในแบบที่คุณพอใจ

3.อะไรคือวิธีที่ดีที่สุดในการทำสิ่งนี้?

สิ่งที่ฉันทำตามปกติเป็นเพียง hooking ที่ไหนสักแห่งใน ( plugins_loaded, after_setup_themeฯลฯ - ขึ้นอยู่กับสิ่งที่คุณต้องการ) แล้วเพียงแค่ต้องการให้พวกเขาทั้งหมด:

foreach ( glob( plugin_dir_path( __FILE__ ) ) as $file )
    require_once $file;

อย่างไรก็ตามคุณสามารถทำให้มันซับซ้อนและยืดหยุ่นได้เช่นกัน ลองดูตัวอย่าง:

<?php

namespace WCM;

defined( 'ABSPATH' ) OR exit;

class FilesLoader implements \IteratorAggregate
{
    private $path = '';

    private $files = array();

    public function __construct( $path )
    {
        $this->setPath( $path );
        $this->setFiles();
    }

    public function setPath( $path )
    {
        if ( empty( $this->path ) )
            $this->path = \plugin_dir_path( __FILE__ ).$path;
    }

    public function setFiles()
    {
        return $this->files = glob( "{$this->getPath()}/*.php" );
    }

    public function getPath()
    {
        return $this->path;
    }

    public function getFiles()
    {
        return $this->files;
    }

    public function getIterator()
    {
        $iterator = new \ArrayIterator( $this->getFiles() );
        return $iterator;
    }

    public function loadFile( $file )
    {
        include_once $file;
    }
}

เป็นคลาสที่ทำพื้นเดียวกัน (ต้องการ PHP 5.3+) ข้อดีคือมันมีความละเอียดมากกว่าเดิมดังนั้นคุณสามารถโหลดไฟล์จากโฟลเดอร์ที่คุณต้องการทำงานเฉพาะได้อย่างง่ายดาย:

$fileLoader = new WCM\FilesLoader( 'assets/php' );

foreach ( $fileLoader as $file )
    $fileLoader->loadFile( $file );

ปรับปรุง

ในฐานะที่เราอาศัยอยู่ในใหม่โลก PHP v5.2 \FilterIteratorโพสต์เราสามารถทำให้การใช้งานของ ตัวอย่างของตัวแปรที่สั้นที่สุด:

$files = new \FilesystemIterator( __DIR__.'/src', \FilesystemIterator::SKIP_DOTS );
foreach ( $files as $file )
{
    /** @noinspection PhpIncludeInspection */
    ! $files->isDir() and include $files->getRealPath();
}

หากคุณต้องติดกับ PHP v5.2 คุณก็ยังสามารถ\DirectoryIteratorใช้รหัสเดิมได้


เย็น. ขอบคุณสำหรับคำอธิบาย :) การตรวจสอบไฟล์ในโฟลเดอร์เฉพาะอาจไม่ช่วยในสิ่งที่ฉันทำแม้ว่าจะเป็นความคิดที่ดีก็ตาม ฉันพยายามที่จะสร้างกรอบซึ่งเป็น Modular ดังนั้น "โมดูล" ทั้งหมดจะอยู่ในไฟล์แยกซึ่งจะถูกระบุว่าเป็นรายการแยกต่างหาก (require_once) ใน functions.php ด้วยวิธีนี้หากใครบางคนไม่ต้องการรวมหนึ่งในโมดูล (ตัวอย่างเช่น: theme-customizer) - จากนั้นก็สามารถคอมเม้นท์อื่น ๆ นั่นคือแผนการต่อไป :) ขอบคุณอีกครั้ง
MegaMan

@MegaMan คุณได้เป็นอย่างดีสามารถกรองเอาท์พุทก่อนที่จะเรียกหรือloadFile() require_onceดังนั้นเพียงแค่เสนอสิ่งต่าง ๆ เช่นการสนับสนุนชุดรูปแบบที่ผู้ใช้สามารถใช้add_theme_support()/remove_*()เพื่อรับโมดูลที่เขาต้องการเท่านั้น แล้วก็ใช้ผลการหรือ$loadFile() glob()Btw หากนี่เป็นทางออกของคุณโปรดทำเครื่องหมายเช่นนี้ ขอบคุณ
ไกเซอร์

0

ฉันทำใหม่ @kaiser ตอบสนองความต้องการของฉัน - คิดว่าฉันแบ่งปัน ฉันต้องการตัวเลือกเพิ่มเติมคำอธิบายภายในโค้ดและตัวอย่างการใช้งานด้านล่าง

รหัส:

<?php

defined( 'ABSPATH' ) OR exit;

/**
 * Functions_File_Loader
 * 
 * Makes it possible to clutter the functions.php into single files.
 * 
 * @author kaiser
 * @author ialocin
 * @link http://wordpress.stackexchange.com/q/111970/22534
 *
 */

class Functions_File_Loader implements IteratorAggregate {

    /**
     * @var array
     */
    private $parameter = array();

    /**
     * @var string
     */
    private $path;

    /**
     * @var string
     */
    private $pattern;

    /**
     * @var integer
     */
    private $flags;

    /**
     * @var array
     */
    private $files = array();

    /**
     * __construct
     *
     * @access public 
     * @param array $parameter
     */
    public function __construct( $parameter ) {
        $this->set_parameter( $parameter );
        $this->set_path( $this->parameter[ 'path' ] );
        $this->set_pattern( $this->parameter[ 'pattern' ] );
        $this->set_flags( $this->parameter[ 'flags' ] );
        $this->set_files();
    }

    /**
     * set_parameter
     *
     * @access public 
     * @param array $parameter
     */
    public function set_parameter( $parameter ) {
        if ( empty( $parameter ) )
            $this->parameter = array('','','');
        else
            $this->parameter = $parameter;
    }

    /**
     * get_parameter
     *
     * @access public 
     * @return array
     */
    public function get_parameter() {
        return $this->parameter;
    }

    /**
     * set_path
     *
     * defaults to get_stylesheet_directory()
     * 
     * @access public 
     * @param string $path
     */
    public function set_path( $path ) {
        if ( empty( $path ) )
            $this->path = get_stylesheet_directory().'/';
        else
            $this->path = get_stylesheet_directory().'/'.$path.'/';
    }

    /**
     * get_path
     *
     * @access public 
     * @return string
     */
    public function get_path() {
        return $this->path;
    }

    /**
     * set_pattern
     *
     * defaults to path plus asterisk »*«
     * 
     * @access public 
     * @param string $pattern
     */
    public function set_pattern( $pattern ) {
        if ( empty( $pattern ) )
            $this->pattern = $this->get_path() . '*';
        else
            $this->pattern = $this->get_path() . $pattern;
    }

    /**
     * get_pattern
     *
     * @access public 
     * @return string
     */
    public function get_pattern() {
        return $this->pattern;
    }

    /**
     * set_flags
     *
     * @access public 
     * @param integer $flags
     */
    public function set_flags( $flags ) {
        if ( empty( $flags ) )
            $this->flags = '0';
        else
            $this->flags = $flags;
    }

    /**
     * get_flags
     *
     * @access public 
     * @return integer
     */
    public function get_flags() {
        return $this->flags;
    }


    /**
     * set_files
     *
     * @access public 
     */
    public function set_files() {
        $pattern = $this->get_pattern();
        $flags = $this->get_flags();
        $files = glob( $pattern, $flags );
        $this->files = $files;
    }


    /**
     * get_files
     *
     * @access public 
     * @return array
     */
    public function get_files() {
        return $this->files;
    }

    /**
     * getIterator
     * 
     * This function name has to be kept
     * 
     * @access public 
     * @return void
     */
    public function getIterator() {
        $iterator = new ArrayIterator( $this->get_files() );
        return $iterator;
    }

    /**
     * load_file
     *
     * @access public 
     * @param string $file
     */
    public function load_file( $file ) {
        include_once $file;
    }
}


ตัวอย่างการใช้งาน:

$parameter = array(
        // define path relative to get_stylesheet_directory()
        // optional, defaults to get_stylesheet_directory()
        'path' => 'includes/plugins',
        // optional, defaults to asterisk »*«
        // matches all files ending with ».php« 
        // and not beginning with »_«, good for quickly deactivating 
        // directories searched are »path« and »subfolders«
        // Additional examples:
        // '{*/,}{[!_],}func-*.php' same as above but for files with a prefix
        // '[!_]*.php' php files in defined »path«, not beginning with »_« 
        'pattern' => '{*/,}[!_]*.php',
        // optional, defaults to 0
        // needed if for example brackets are used
        // more information: http://www.php.net/manual/en/function.glob.php
        'flags' => GLOB_BRACE
    );
// create object
$functionsfileloader = new Functions_File_Loader( $parameter );
// load the files
foreach ( $functionsfileloader as $file ) {
    $functionsfileloader->load_file( $file );
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.