Singole funzioni.php o divise in molti piccoli file?


14

Sto creando un semplice framework con opzioni a tema. Ho diviso blocchi di codice all'interno functions.phpe li ho inseriti in una struttura di cartelle specifica.

Ora nel mio functions.phpfile principale , ho solo require_oncechiamate a questi file.

Ma per ragioni di argomento, diciamo che finirò con 20 file da includere.

DOMANDE:

  1. Questo ha effetto sulle prestazioni del WP in modo visibile?
  2. È meglio tenerlo tutto all'interno di 1 file (Functions.php)
  3. qual è il modo migliore per farlo?

Grazie.

Risposte:


12

1. Questo ha effetto sulle prestazioni del WP in modo visibile?

Se avrebbe un effetto reale su alcuni file di piccole dimensioni, avrebbe un effetto che ha un impatto inferiore a WP: PHP e le prestazioni del server. Ha davvero un effetto? Non proprio. Ma puoi semplicemente iniziare a fare test di performance da solo.

2. È meglio tenerlo tutto all'interno di 1 file (Functions.php)

Ora la domanda è "Cosa c'è di meglio"? Dal tempo complessivo di caricamento dei file? Dal punto di vista dell'organizzazione dei file? Comunque, non fa alcuna differenza. Fallo in modo da non perdere la visione d'insieme e mantenere il risultato in modo piacevole per te.

3. qual è il modo migliore per farlo?

Quello che faccio di solito è semplicemente agganciando da qualche parte in ( plugins_loaded, after_setup_theme, ecc - dipende da quello che ti serve) e poi semplicemente li richiedono:

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

Ad ogni modo, puoi renderlo un po 'più complicato e flessibile. Dai un'occhiata a questo esempio:

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

È una classe che fa praticamente la stessa cosa (ha bisogno di PHP 5.3+). Il vantaggio è che è un po 'più fine, quindi puoi semplicemente caricare file da cartelle che ti servono per eseguire un'attività specifica:

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

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

Aggiornare

Mentre viviamo in un nuovo mondo post PHP v5.2, possiamo fare uso di \FilterIterator. Esempio della variante più breve:

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

Se devi rimanere con PHP v5.2, puoi comunque usare \DirectoryIteratorlo stesso codice e praticamente.


freddo. Grazie per la spiegazione :) controllare i file in una cartella specifica probabilmente non aiuterà con quello che sto facendo, anche se è una buona idea. Sto cercando di creare un framework modulare. Quindi tutti i "moduli" sarebbero in file separati che sarebbero elencati come voci separate (request_once) nel function.php. In questo modo se qualcuno non vuole includere uno dei moduli (ad esempio: tema-personalizzatore) - allora può solo commentarlo ecc. Questo è comunque il piano :) Grazie ancora.
MegaMan,

@MegaMan Puoi anche filtrare l'output prima di chiamare loadFile()o require_once. Quindi offri semplicemente qualcosa come il supporto del tema in cui l'utente stesso può usare add_theme_support()/remove_*()solo per prendere i moduli che desidera. Quindi utilizzare semplicemente il risultato per $loadFile()o glob(). A proposito, se questa fosse la tua soluzione, per favore contrassegnala come tale. Grazie.
Kaiser

0

Ho rielaborato @kaiser rispondendo un po 'alle mie esigenze - ho pensato di condividerlo. Volevo più opzioni, quelle sono spiegate all'interno del codice e nell'esempio di utilizzo di seguito.

Codice:

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


Esempio di utilizzo:

$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 );
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.