단일 functions.php 또는 여러 개의 작은 파일로 분할됩니까?


14

테마 옵션이있는 간단한 프레임 워크를 만들고 있습니다. 코드 덩어리를 분할 functions.php하여 특정 폴더 구조 내에 배치했습니다.

이제 주 functions.php파일에는 require_once이러한 파일에 대한 호출 만 있습니다 .

그러나 논쟁을 위해-포함 할 20 개의 파일이 있다고 가정 해 봅시다.

질문 :

  1. 이것은 WP 성능에 눈에 띄는 방식으로 영향을 미칩니 까?
  2. 모든 것을 1 파일 (functions.php) 내에 유지하는 것이 좋습니다
  3. 이것에 대해 가장 좋은 방법은 무엇입니까?

감사.

답변:


12

1. 이것은 WP 성능에 눈에 띄는 방식으로 영향을 미칩니 까?

경우 PHP 서버 성능 : 그것은 실제가 약간 작은 파일에 영향을 줄 것이다, 다음은 그 낮은 WP보다 영향을 영향을 줄 것이다. 실제로 영향을 미칩니 까? 실제로는 아닙니다. 그러나 여전히 성능 테스트를 직접 시작할 수 있습니다.

2. 1 개 파일 (functions.php) 내에 모두 보관하는 것이 좋습니다

이제 질문은 "무엇이 더 낫습니까?"입니다. 전체 파일 로딩 시간에서? 파일 구성 관점에서? 어쨌든 아무런 차이가 없습니다. 개요를 느슨하게하지 않고 결과를 기분 좋게 유지할 수있는 방식으로 수행하십시오.

3. 이것에 대해 가장 좋은 방법은 무엇입니까?

내가 일반적으로 단순히 어딘가에 후킹하면된다 ( 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 프레임 워크를 만들려고합니다. 따라서 모든 "모듈"은 functions.php에서 별도의 항목 (require_once)으로 나열되는 별도의 파일에 있습니다. 누군가가 모듈 중 하나를 포함하고 싶지 않으면 (예 : 테마 사용자 정의) 그런 식으로 주석을 달 수 있습니다. 어쨌든 계획입니다 :) 다시 한번 감사드립니다.
MegaMan

당신은뿐만 아니라 호출하기 전에 출력을 필터링 할 수 @MegaMan loadFile()require_once. 따라서 사용자 add_theme_support()/remove_*()가 원하는 모듈 만 가져갈 수있는 테마 지원과 같은 것을 제공하기 만하면 됩니다. 그런 다음 단순히 $loadFile()또는에 대한 결과를 사용하십시오 glob(). Btw, 이것이 당신의 해결책이라면, 그렇게 표시하십시오. 감사.
kaiser

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.