在 PHP 中组织小函数的正确方法

Proper way to organize Small Functions in PHP

我有一堆小实用程序 PHP 函数,我根据自己的喜好制作了这些函数来解决不同的脚本问题。 UUID() 和 trackUserActivity() 等函数。这些函数数不胜数,而且每天都在增加。

假设我有大约 50 个不同的小函数。并为我的应用程序获得了大约 100 个不同的脚本。有时这 100 个脚本必须调用其中的 3 个甚至 5 个函数,有时它们只调用 50 个函数中的一个。

想请问各位高手是怎么组织这么一堆函数的?要么将所有函数放在一个单独的文件夹中,每个函数放入一个单独的文件中并单独包含,要么创建一个 class 并将所有这些函数添加到其中并包含 class 调用具有对象实例化的函数?

我认为制作一个包含 50 个函数的 class 并包含 class 不是个好主意,即使是为了调用单个函数。但我想确定一下。

我在 Organize small utilities functions 发现了这个问题,但这特别适用于 Java,它似乎不适合 PHP 的情况。

我搜索了可以提出这个问题的其他 StackExchange 站点,但找不到更好的代码管理位置。我检查了 https://sqa.stackexchange.com/ and https://pm.stackexchange.com/,但其中 none 似乎适合此类问题。

spl_autoload_register() 功能是让事情井井有条的便捷方式。您可以使用它来根据需要加载静态 class 方法,方法是将它放在 'init.php' 文件中,您需要在每个脚本的顶部使用它。这是一个哈希 class 的示例,其中包含创建盐和哈希的静态方法:

<?php
  require_once('init.php');
  $salt = Hash::salt(32); 
  $pw   = Hash::make($_POST['password'], $salt);
?>

使用 init.phpclasses/Hash.php 文件查找,例如,像下面这样:

init.php:

<?php
  spl_autoload_register(function($class) {
    require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/' . $class . '.php';
  });
?>

Hash.php:

<?php
class Hash {
  public static function make($string, $salt = '') {
    return hash('sha256', $string . $salt);
  }

  public static function salt($length) {
    return base64_encode(openssl_random_pseudo_bytes($length));
  }
}
?>

spl_autoload_register() 函数在您的代码中首次遇到实例化或使用静态方法时,它会根据您作为参数提供的函数找到合适的 class。

您可以通过将相关函数分组为静态方法来利用这一优势。例如,我的特定项目的 classes 目录有:

Config.php              Cookie.php           DB.php
Err.php                 FormatError.php      Hash.php
Input.php               MismatchError.php    Redirect.php
RequiredFieldError.php  Session.php          StringLengthError.php
Token.php               UniqueItemError.php  User.php
Validate.php

其中包含彼此相关的静态方法等。只有当 Php 在我的包含 init.php 文件的任何脚本中的任何地方遇到它们的名字时,它们才会被加载。

compuphys 的回答确实帮助了我。对于那些已经在使用 composerAutoload.php 文件的人,您必须注册您的 spl 函数,而不是像下面那样匿名调用

function myAutoLoader($className)
{
    $file = __dir__.'/classes/'.$className'.php';
    if(file_exists($file))
    {
         include_once($file);
    }
}

spl_autoload_register('myAutoLoader');