【问题标题】:What is the best way to include PHP libraries when using static factory pattern?使用静态工厂模式时包含 PHP 库的最佳方式是什么?
【发布时间】:2010-09-20 23:25:03
【问题描述】:

我的 PHP 库中有几个静态工厂模式。但是,内存占用正在失控,我们希望减少执行期间所需的文件数量。以下是我们今天所处位置的一个示例:

require_once('Car.php');
require_once('Truck.php');

abstract class Auto
{
    // ... some stuff ...

    public static function Create($type)
    {
        switch ($type) {
            case 'Truck':
                return new Truck();
                break;
            case 'Car':
            default:
                return new Car();
                break;
        }
    }
}

这是不可取的,因为需要包含 Car.php 和 Truck.php,即使可能只需要其中一个。据我所知, require/include 及其 ..._once 变体包括与调用范围相同的库。这是真的吗?

如果是这样,我相信这会导致内存泄漏:

    abstract class Auto
    {
        // ... some stuff ...

        public static function Create($type)
        {
            switch ($type) {
                case 'Truck':
                    require_once('Truck.php');
                    return new Truck();
                    break;
                case 'Car':
                default:
                    require_once('Car.php');
                    return new Car();
                    break;
            }
        }
    }

在我看来,在第二个示例中,即使使用了 require_once 风格,对 Create() 的多次调用也会因为调用的范围而导致多次请求。

这是真的吗?在诸如此类的示例中,在 php 中动态包含库的最佳方法是什么?

谢谢!

【问题讨论】:

    标签: php include polymorphism require require-once


    【解决方案1】:

    自动加载工具通常被视为邪恶,但它在这些任务中工作得非常好。

    如果你能得到一个好的文件系统类名映射,那么当你提供一个类时,你可以找到它,那么它将节省你的开销并且只在需要时加载类。

    它也适用于静态类,因此一旦静态类在作用域内,它甚至不需要调用一次 require 的“是否包含文件”测试,因为该类已经在符号表中。

    然后你就可以创建了

    require("autoloader.php"); 
    $x = new Car();  
    $x = new Bike(); 
    

    它会在需要时将它们带入。

    请参阅Php.net/__autoload 了解更多详情。

    【讨论】:

    • 自动加载的语法糖是否要求不在本地范围内?
    • 当文件“required”包含类定义时,本地范围没有问题。 PHP 不支持像 Java 这样的“内部类”;所有类都定义在当前命名空间的“顶层”。
    【解决方案2】:

    我建议使用autoloader

    也就是说,不要使用require_once() 来要求任何一个子类,而是允许自动加载器在您调用new Truck()new Car() 时调用一个可以加载所引用类的函数。

    至于内存泄漏的问题,不,require_once不受代码块的影响。

    【讨论】:

      【解决方案3】:

      【讨论】:

        【解决方案4】:

        require_once 函数的要点是,无论作用域如何,您都不会包含两次文件并重新定义导致 PHP 错误的类。所以不用担心内存泄漏,如果 require_once 被命中,类 def 只会进入全局符号表一次。

        但除此之外,是的,使用自动加载器。

        【讨论】:

          猜你喜欢
          • 2023-03-11
          • 1970-01-01
          • 2011-06-18
          • 1970-01-01
          • 2010-09-09
          • 2011-12-16
          • 2010-10-30
          • 1970-01-01
          相关资源
          最近更新 更多