gpt4 book ai didi

php - __construct 的可见性

转载 作者:可可西里 更新时间:2023-11-01 00:22:58 26 4
gpt4 key购买 nike

如果我有:

abstract class AbstractSingleton
{
protected static $instance;

public static function & getInstance()
{
if(null === static::$instance) static::$instance = new static();
return static::$instance;
}

protected function __construct() { }
}

扩展类的用户是否可以重新定义__construct 的可见性?

class Singleton extends AbstractSingleton
{
public function __construct() { } // That would be a problem
}

第二个问题,如果 __construct 在 AbstractSingleton 中被定义为私有(private)的,子类会发生什么?根本没有构造函数吗?是否为该类提供了新的默认构造函数,如果是,其可见性如何?

最佳答案

好吧,对于初学者来说,您不需要从您的方法中返回一个引用 (&)。从 PHP 5 开始,对象默认通过引用传递和返回。

对于您的实际问题,要让子级访问父级的成员,其访问修饰符至少需要受到保护。这对构造函数也很重要。因此,在您的情况下,子类可以执行以下操作:

abstract class AbstractSingleton
{
protected __ construct() {}
}

class Singleton extends AbstractSingleton
{
public __construct()
{
parent::__construct();

// more code
}
}

解决这个问题的方法是使用 final 关键字。请参阅:PHP documentation .

对于你的第二个问题,如果你将 AbstractSingleton 的构造函数设为私有(private)并尝试在其子级上调用一个构造函数,那么将使用默认的公共(public)构造函数,就像往常一样。

编辑:综上所述,单例几乎不是一个好主意,尤其是在 PHP 中。很有可能,您只需利用通过引用自动传递/返回的 PHP 对象就可以解决您的问题。如果不是,依赖注入(inject)是一种更适合 OOP 的替代方案。

关于php - __construct 的可见性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13711764/

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