gpt4 book ai didi

php - 保护 PHP 类免受意外实例化?

转载 作者:行者123 更新时间:2023-12-05 09:25:32 28 4
gpt4 key购买 nike

我正在开发一个 PHP 库,我们将在其中为客户提供加密代码。该代码将包括一个他们可以实例化的主要类,该类将处理许可证验证并公开其使用方法。主类将实例化几个子类,每个子类都包含在自己的文件中。我怎样才能防止我们的客户包含子类文件并实例化子类本身以供使用?有没有一种方法可以防止子类在我们的主类之外被实例化?

最佳答案

大胆的猜测,但对主类使用单例,对所有子类使用带有(主类的)依赖注入(inject)的工厂/单例。这样子类甚至不会在没有对主类实例的有效引用的情况下加载。

编辑:由于这个答案被接受,我决定提供一个例子,以供 future 读者引用。另外,不要忘记将所有类(class)标记为 final类。

初级类:

final class myPrimaryClass {

private static $instance = null;

private function __construct() {
// do something or not
return $this;
}

public static function getInstance() {
if (is_null(self::$instance) || !(self::$instance instanceof myPrimaryClass))
self::$instance = new myPrimaryClass;
return self::$instance;
}
}

单例子类:

final class mySingletonSubClass {

private static $instance = null;

private function __construct(myPrimaryClass $primaryClassInstanceRef) {
return $this;
}

public static function getInstance(myPrimaryClass $primaryClassInstanceRef) {
if (is_null(self::$instance) || !(self::$instance instanceof mySingletonSubClass))
self::$instance = new mySingletonSubClass($primaryClassInstanceRef);
return self::$instance;
}
}

工厂子类:

final class myFactorySubClass {

private function __construct(myPrimaryClass $primaryClassInstanceRef) {
return $this;
}

public static function getNewInstance(myPrimaryClass $primaryClassInstanceRef) {
return new myFactorySubClass($primaryClassInstanceRef);
}
}

关于这个例子的两个注意事项;首先,我当然把事情简单化了。其次,您可以使用的一个巧妙的技巧是稍微修改子类,以便 getInstance() 方法在第一次后不需要始终将主类的实例作为参数传递。我将在这里提供一个单例类的例子:

final class mySingletonSubClass {

private static $instance = null;
private static $classInstanceRef = null;

private function __construct(myPrimaryClass $primaryClassInstanceRef) {
return $this;
}

public static function getInstance(myPrimaryClass $primaryClassInstanceRef = null) {
if (!is_null($primaryClassInstanceRef))
self::$classInstanceRef = $primaryClassInstanceRef;

if (is_null(self::$instance) || !(self::$instance instanceof mySingletonSubClass))
self::$instance = new mySingletonSubClass(self::$classInstanceRef);

return self::$instance;
}
}

请注意,这在很大程度上依赖于 PHP's type-hinting mechanism .因此,你应该 read the manual entry on it这样您就可以了解其中的细微差别(例如默认为 null)。

关于php - 保护 PHP 类免受意外实例化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1670718/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com