vladimmi/construct-static

此包的最新版本(dev-master)没有可用的许可证信息。

用于实现静态类构造函数的小型Composer包装器

dev-master 2023-01-09 11:32 UTC

This package is not auto-updated.

Last update: 2024-09-28 18:05:20 UTC


README

这是一个小型包装器,用于Composer类加载器,旨在添加类似于Java中静态初始化器的功能。您可以定义名为__constructStatic()的静态方法,当类首次加载到项目中时,它将被调用。

示例

class MyTestClass
{
    private static function __constructStatic()
    {
        //this will be called once after class loaded
    }
}

要求

无需外部库,只需在项目中使用Composer自动加载器。

安装

将以下内容添加到composer.json文件的require块中:"vladimmi/construct-static": "dev-master@dev"

使用方法

$composer = require_once(__DIR__ . '/vendor/autoload.php');     //get Composer loader
$loader = new ConstructStatic\Loader($composer);                //wrap it   

详细信息

Composer自动加载器被注销,并使用这个包装器。然后所有类加载调用都通过这个加载器转到Composer。您可以使用上面示例中的$loader作为原始的$composer对象 - 所有方法调用都被代理到包装加载器。

其他可能的自动加载器仍然被注册,所以请检查生成的加载器顺序,以防止出现意外结果。

选项

处理先前加载的类

如果您想调用在包装器创建之前加载的类的静态构造函数,可以使用processLoadedClasses方法来实现这一点

$composer = require_once(__DIR__ . '/vendor/autoload.php');
$loader = new ConstructStatic\Loader($composer);
$loader->processLoadedClasses();        //call constructors on every already loaded class

传递自定义数据到调用的构造函数

您可以将一些数据传递到调用的构造函数中 - 例如,注入服务或传递DI容器。为此,您需要稍微修改构造函数

class MyTestClass
{
    //Added $params parameter
    private static function __constructStatic($params = [])
    {
        //this will be called once after class loaded
    }
}

然后您可以在创建包装加载器时设置所需的数据

$composer = require_once(__DIR__ . '/vendor/autoload.php');
$params = [
    //set any needed data here...
];
$loader = new ConstructStatic\Loader($composer, $params);   //...and pass it to loader

这些$params将被传递到每个调用的构造函数。如果您只想将一些参数集传递给指定的类以防止冲突或任何其他原因,您可以通过这种方式设置它们

$composer = require_once(__DIR__ . '/vendor/autoload.php');
$params = [
    //set any default data here
];
$anyYourClassParams = [
    //set any data for specific class here
];
$loader = new ConstructStatic\Loader($composer, $params);               //pass default data to loader
$loader->setClassParameters(AnyYourClass::class, $anyYourClassParams);  //pass data for specific class to loader

然后当AnyYourClass被加载时,它将接收到$anyYourClassParams而不是$params,而任何其他类将接收到默认设置的$params