PHP 阻止标准实例化 class
PHP prevent instantiation of standard class
(这只是理论问题,并不是为了作为一个很好的例子)
假设我写了某种 orm,所有开发人员都应该使用这个 class,是否可以禁止在 php 中实例化某些标准 class,以确保不会与此数据库建立其他连接吗?
例如mysqli应该是构建不出来的
这个技术可行吗?
谢谢
有几种方法
...但是 none 是完美的。
简单的方法
如果您不想让任何人实例化 mysql/i
、mongodb
或类似的东西,您只需卸载扩展程序即可。那么您的 ORM 将需要使用另一个连接 class。
骇人听闻的方式
有一个名为 runkit 的不错的扩展,它包含了您永远不应使用的所有功能。可以从 classes 中删除方法,这样您就可以覆盖要阻止的 class 的构造函数。我需要指出这是一个 真的 坏主意吗?
好方法
... 是代码审查。您可能认为这些并没有真正阻止某人使用 mysqli
,但是:
- 你不需要通过规避 ORM 做比你的同行更糟糕的事情。
- 您知道谁尝试过并且能够向他们解释为什么他们不应该这样做。
- 您实际上可以使用 class。您可能认为现在您永远不需要它,但也许您的紧急记录器不应该依赖于您的 ORM。哦,顺便说一下,您的 ORM 也需要使用它。
TL;DR
正确检查您的代码。无论如何,它是良好编码风格的一部分,可以防止不良解决方案强制实施良好解决方案,并在需要时允许例外情况。
(这只是理论问题,并不是为了作为一个很好的例子)
假设我写了某种 orm,所有开发人员都应该使用这个 class,是否可以禁止在 php 中实例化某些标准 class,以确保不会与此数据库建立其他连接吗?
例如mysqli应该是构建不出来的
这个技术可行吗?
谢谢
有几种方法
...但是 none 是完美的。
简单的方法
如果您不想让任何人实例化 mysql/i
、mongodb
或类似的东西,您只需卸载扩展程序即可。那么您的 ORM 将需要使用另一个连接 class。
骇人听闻的方式
有一个名为 runkit 的不错的扩展,它包含了您永远不应使用的所有功能。可以从 classes 中删除方法,这样您就可以覆盖要阻止的 class 的构造函数。我需要指出这是一个 真的 坏主意吗?
好方法
... 是代码审查。您可能认为这些并没有真正阻止某人使用 mysqli
,但是:
- 你不需要通过规避 ORM 做比你的同行更糟糕的事情。
- 您知道谁尝试过并且能够向他们解释为什么他们不应该这样做。
- 您实际上可以使用 class。您可能认为现在您永远不需要它,但也许您的紧急记录器不应该依赖于您的 ORM。哦,顺便说一下,您的 ORM 也需要使用它。
TL;DR
正确检查您的代码。无论如何,它是良好编码风格的一部分,可以防止不良解决方案强制实施良好解决方案,并在需要时允许例外情况。