Php 可以将析构函数声明为private吗?

Php 可以将析构函数声明为private吗?,php,oop,Php,Oop,我的一些类将其构造函数声明为私有的,因为此类的对象只允许由类的静态方法创建。我也可以将此类类的析构函数声明为private以保持对称,这样安全吗 编辑:好的,似乎这根本不可能: Fatal error: Call to private AClass::__destruct() from context '' in /script on line 0 (上下文为空,不存在第0行)。出于某种原因,我曾经认为PHP运行时是万能的,可以破坏它想要的任何东西。似乎您正在实现单例模式。在此模式中,构造函数

我的一些类将其构造函数声明为私有的,因为此类的对象只允许由类的静态方法创建。我也可以将此类类的析构函数声明为private以保持对称,这样安全吗

编辑:好的,似乎这根本不可能:

Fatal error: Call to private AClass::__destruct() from context '' in /script on line 0

(上下文为空,不存在第0行)。出于某种原因,我曾经认为PHP运行时是万能的,可以破坏它想要的任何东西。

似乎您正在实现单例模式。在此模式中,构造函数必须是私有的,并且您有一个返回类实例的静态方法。如果没有实例,这个静态方法将创建它并返回它


如果将析构函数访问权限设置为private,则不允许其他类或函数析构函数该实例,如果在应用程序的执行点不再使用该实例,则这可能是不一致的。没有理由将析构函数设置为private,因为即使它是公共的,静态方法也能够在没有实例的情况下返回新实例。

在php中,
\u destruct
魔术方法必须是
公共的
。该方法将自动在实例外部调用。将
\uu destruct
声明为
受保护
私有
将导致警告,并且不会调用magic方法


没有必要对称,因为您永远不应该显式调用
\uu destruct

,它们仍然必须小心在静态getter和destructor之间同步类定义中的单例指针/槽。不要让静态getter在单例模式被销毁之前返回它。还要记住,单例模式在大多数(并非所有)情况下都是非常糟糕的模式,并且会带来许多设计问题。也不可能对它们进行适当的单元测试。在构造类的对象时,它是通过这种方式实现的,用多个静态方法模拟函数重载(PHP不支持重载)致命错误:声明为private时从上下文调用private Foo::_destruct()