Hàm đơn.php hoặc chia thành nhiều tệp nhỏ?


14

Tôi đang tạo ra một khung đơn giản với các tùy chọn chủ đề. Tôi đã chia các đoạn mã bên trong functions.phpvà đặt nó trong một cấu trúc thư mục cụ thể.

Bây giờ trong functions.phptệp chính của tôi , tôi chỉ có require_oncecác cuộc gọi đến các tệp này.

Nhưng để tranh luận - giả sử rằng tôi sẽ kết thúc với 20 tệp để đưa vào.

CÂU HỎI:

  1. Điều này có ảnh hưởng đến hiệu suất WP một cách rõ ràng không?
  2. Có tốt hơn để giữ tất cả trong vòng 1 tệp (Hàm.php)
  3. cách tốt nhất để làm việc này là gì ?

Cảm ơn.

Câu trả lời:


12

1. Điều này có ảnh hưởng đến hiệu suất WP một cách rõ ràng không?

NẾU nó sẽ có ảnh hưởng thực sự đối với một số tệp nhỏ, thì nó sẽ có ảnh hưởng có tác động thấp hơn WP: PHP và hiệu suất máy chủ. Nó thực sự có ảnh hưởng? Không hẳn vậy. Nhưng bạn vẫn có thể tự mình bắt đầu thực hiện các bài kiểm tra hiệu suất.

2. Có tốt hơn không khi giữ tất cả trong vòng 1 tệp (Hàm.php)

Bây giờ câu hỏi là "cái gì tốt hơn"? Từ thời gian tải tập tin tổng thể? Từ quan điểm tổ chức tập tin? Dù sao, nó không làm cho bất kỳ sự khác biệt. Làm theo cách để bạn không mất tổng quan và có thể duy trì kết quả theo cách dễ chịu cho bạn.

3. cách tốt nhất để đi về điều này là gì?

Những gì tôi thường làm là chỉ đơn giản là hooking nơi nào đó trong ( plugins_loaded, after_setup_theme, vv - phụ thuộc vào những gì bạn cần) và sau đó chỉ cần yêu cầu họ tất cả:

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

Dù sao, bạn cũng có thể làm cho nó phức tạp hơn một chút và linh hoạt. Hãy xem ví dụ đó:

<?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;
    }
}

Đây là một lớp về cơ bản giống nhau (cần PHP 5.3+). Lợi ích là nó tốt hơn một chút, do đó bạn có thể dễ dàng tải các tệp từ các thư mục mà bạn cần để thực hiện một tác vụ cụ thể:

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

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

Cập nhật

Khi chúng ta sống trong một thế giới mới, bài PHP v5.2, chúng ta có thể sử dụng \FilterIterator. Ví dụ về biến thể ngắn nhất:

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

Nếu bạn phải gắn bó với PHP v5.2, thì bạn vẫn có thể đi cùng \DirectoryIteratorvà khá nhiều mã giống nhau.


mát mẻ. Cảm ơn bạn đã giải thích :) kiểm tra các tệp trong một thư mục cụ thể có thể sẽ không giúp ích cho những gì tôi đang làm, mặc dù đó là một ý tưởng hay. Tôi đang cố gắng tạo ra một khung công tác Modular. Vì vậy, tất cả các "mô-đun" sẽ nằm trong các tệp riêng biệt sẽ được liệt kê dưới dạng các mục riêng biệt (allow_once) trong hàm.php. Theo cách đó, nếu ai đó không muốn bao gồm một trong các mô-đun (ví dụ: tùy biến chủ đề) - thì bạn chỉ có thể nhận xét rằng vv Dù sao đó cũng là kế hoạch :) Cảm ơn một lần nữa.
MegaMan

@MegaMan Bạn cũng có thể lọc đầu ra trước khi gọi loadFile()hoặc require_once. Vì vậy, chỉ cần cung cấp một cái gì đó như hỗ trợ chủ đề, nơi bản thân người dùng có thể sử dụng add_theme_support()/remove_*()để chỉ lấy các mô-đun mình muốn. Sau đó, chỉ cần sử dụng kết quả cho $loadFile()hoặc glob(). Btw, nếu đây là giải pháp của bạn, vui lòng đánh dấu nó như vậy. Cảm ơn.
kaiser

0

Tôi đã làm lại @kaiser trả lời một chút cho nhu cầu của mình - nghĩ rằng tôi chia sẻ nó. Tôi muốn có nhiều tùy chọn hơn, chúng được giải thích bên trong mã và tại ví dụ sử dụng bên dưới.

Mã số:

<?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;
    }
}


Ví dụ sử dụng:

$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 );
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.