Partial

    目录

    imi 的 Partial 特性是从 C# 中借鉴而来,可以将一个类的部分分成几个文件来书写,使用trait编写,并在注解中加上 @Partial,可以方便地注入。

    在实际开发中,Partial 特性有以下应用场景:

    • 多人协作开发,可以将不同的方法分配给不同的人开发,每个人只需要在自己的文件中编写,不用担心冲突问题。
    • 类的方法特别多,并且无法很好地拆分,此时可以将类分成几个文件来维护。
    • 有一些类是通过工具生成的,如果我们在类里编写了自己的代码,又需要重新生成一些内容,这时候会覆盖我们编写的代码。使用 Partial 在另一个文件中开发,不会被覆盖掉。

    使用方法

    需要被注入的类:

    <?php
    namespace Imi\Test\Component\Partial\Classes;
    
    use Imi\Bean\Annotation\Bean;
    
    /**
     * @Bean("PartialClassA")
     */
    class PartialClassA
    {
        public function test1()
        {
            return 1;
        }
    
    }
    

    定义 Partial:

    <?php
    namespace Imi\Test\Component\Partial\Partial
    {
        use Imi\Bean\Annotation\Partial;
    
        /**
         * @Partial(Imi\Test\Component\Partial\Classes\PartialClassA::class)
         */
        trait TPartialClassA1
        {
            public $test2Value = 2;
    
            public function test2()
            {
                return $this->test2Value;
            }
    
        }
    
    }
    
    // 以下为方便 IDE 提示而写,非必须
    namespace Imi\Test\Component\Partial\Classes
    {
        // 必须用这个括起来,代码不会执行,但是 IDE 提示有效
        if(false)
        {
            class PartialClassA
            {
                public $test2Value;
    
                public function test2()
                {
    
                }
            }
        }
    
    }

    调用:

    /** @var \Imi\Test\Component\Partial\Classes\PartialClassA $test */
    $test = App::getBean('PartialClassA');
    var_dump($test->test1());
    // 原类中没定义,但通过 partial 可以正常调用
    // 通过反射也可以获取到,是实实在在存在的方法和属性
    var_dump($test->test2());
    var_dump($test->test2Value);

    注意事项:

    • 命名空间 namespace 必须用 {} 括起来。
    • 下面一部分代码是为方便 IDE 提示而写,非必须。如果写,则必须在里面写 if(false){},否则会出现重复定义类错误!
    • 被注入的类、Partial 定义类。
    • 使用被注入类对象时,必须通过容器,否则不生效。