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
ใช้รหัสเดิมได้