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 \DirectoryIterator
và khá nhiều mã giống nhau.