একক ফাংশন.এফপি বা অনেক ছোট ফাইলগুলিতে বিভক্ত?


14

আমি থিম বিকল্পগুলি সহ একটি সাধারণ কাঠামো তৈরি করছি। আমি কোডের অংশগুলিকে এর মধ্যে ভাগ করেছি functions.phpএবং এটি একটি নির্দিষ্ট ফোল্ডারের কাঠামোর মধ্যে রেখেছি ।

এখন আমার মূল functions.phpফাইলটিতে আমার কাছে কেবল require_onceএই ফাইলগুলিতে কল রয়েছে।

তবে তর্কের খাতিরে - আসুন বলি যে আমি অন্তর্ভুক্ত করার জন্য 20 টি ফাইল অন্তর্ভুক্ত করব।

প্রশ্ন:

  1. এটি কি দৃশ্যমান উপায়ে ডাব্লুপি পারফরম্যান্সের উপর প্রভাব ফেলে?
  2. এটিকে 1 টি ফাইলের মধ্যে রাখা ভাল (ফাংশন.এফপি)
  3. এটি সম্পর্কে সবচেয়ে ভাল উপায় কি?

ধন্যবাদ।

উত্তর:


12

1. এটি কি দৃশ্যমান উপায়ে ডাব্লুপি পারফরম্যান্সের উপর প্রভাব ফেলে?

যদি এটি কিছু ছোট ফাইলের জন্য প্রকৃতভাবে প্রভাবিত করে, তবে তার প্রভাবটি ডাব্লুপি: পিএইচপি এবং সার্ভারের কার্যকারিতার চেয়ে কম রয়েছে। এটি কি আসলেই প্রভাব ফেলে? আসলে তা না. তবে আপনি কেবল পারফরম্যান্স পরীক্ষা নিজেই করা শুরু করতে পারেন।

২. এটি সব 1 টি ফাইলের মধ্যে রাখা ভাল (ফাংশন.এফপি)

এখন প্রশ্ন "ভাল কি"? সামগ্রিক ফাইল (গুলি) লোডিং সময় থেকে? ফাইল সংস্থার দৃষ্টিকোণ থেকে? যাইহোক, এটি কোনও পার্থক্য করে না। এটি এমনভাবে করুন যাতে আপনি ওভারভিউটি looseিলে না রাখেন এবং ফলটি এমনভাবে বজায় রাখতে পারবেন যা আপনার জন্য আনন্দদায়ক।

৩. এটি সম্পর্কে সবচেয়ে ভাল উপায় কী?

আমি কি স্বাভাবিকভাবে করতে কেবল কোথাও 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;
    }
}

এটি এমন একটি বর্গ যা মূলত একই রকম হয় (পিএইচপি 5.3+ প্রয়োজন)। সুবিধাটি হ'ল এটি কিছুটা সূক্ষ্ম দানযুক্ত, যাতে আপনি সহজেই কোনও নির্দিষ্ট কাজ সম্পাদন করতে হবে এমন ফোল্ডারগুলি থেকে ফাইলগুলি লোড করতে পারেন:

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

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

হালনাগাদ

আমরা যেমন একটি নতুন, পোস্ট পিএইচপি v5.2 বিশ্বে বাস করি, আমরা এর ব্যবহার করতে পারি \FilterIterator। সংক্ষিপ্ত রূপটির উদাহরণ:

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

যদি আপনাকে পিএইচপি v5.2 দিয়ে আটকাতে হয় তবে আপনি এখনও \DirectoryIteratorএকই কোডটি দিয়ে যেতে পারেন ।


শীতল। ব্যাখ্যার জন্য আপনাকে ধন্যবাদ :) একটি নির্দিষ্ট ফোল্ডারে ফাইলগুলি পরীক্ষা করা সম্ভবত আমি যা করছি তাতে সাহায্য করবে না যদিও এটি একটি দুর্দান্ত ধারণা। আমি এমন একটি কাঠামো তৈরি করার চেষ্টা করছি যা মডুলার। সুতরাং সমস্ত "মডিউল" আলাদা ফাইলে থাকবে যা ফাংশন.এফপি-তে পৃথক এন্ট্রি (প্রয়োজনীয়_অনসেস) হিসাবে তালিকাভুক্ত হবে। এইভাবে যদি কেউ মডিউলগুলির মধ্যে একটি অন্তর্ভুক্ত না করতে চায় (উদাহরণস্বরূপ: থিম-কাস্টমাইজার) - তবে কেবল মন্তব্য করতে পারেন ইত্যাদি That's
মেগাম্যান

@ মেগামন আপনি কল করার আগে loadFile()বা আউটপুট ফিল্টার করতে পারতেন require_once। সুতরাং কেবল থিম সহায়তার মতো কিছু প্রস্তাব করুন যেখানে ব্যবহারকারী নিজে নিজের add_theme_support()/remove_*()পছন্দমতো মডিউলগুলি ব্যবহার করতে পারবেন । তারপরে $loadFile()বা এর জন্য কেবল ফলাফলটি ব্যবহার করুন glob()। বিটিডব্লিউ, এটি যদি আপনার সমাধান হয় তবে দয়া করে এটি চিহ্নিত করুন। ধন্যবাদ।
কায়সার

0

আমি @ কাইজারকে আমার প্রয়োজনের জন্য কিছুটা উত্তর দিয়েছি - ভেবেছি আমি এটি ভাগ করে নিই। আমি আরও বিকল্প চেয়েছিলাম, সেগুলি কোডের ভিতরে এবং নীচের ব্যবহারের উদাহরণে ব্যাখ্যা করা হয়েছে।

কোড:

<?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.