对于我的一个项目,我需要克隆或重新定义蒸汽包装。我需要在require
,fopen
等之前通过某些函数处理所有文件。基本上,它就像模拟虚拟文件系统 - PHP需要修改实际文件内容。
目前,我通过stream_wrapper_register()
定义自定义包装并通过mywrapper://(original path)
要求索引文件来解决这个问题。这工作,我解决了修改文件的文件大小差异的问题,但我有一个市长问题 - 所有常量如__dir__
和一些函数在开始时返回带mywrapper://
的路径,这不好 - 我不知道我想要它。
此问题的最佳解决方案似乎重新定义file://
而不是定义自定义mywrapper://
,因为所有文件请求都将转移到我的班级。我甚至可以毫无问题地重新定义文件包装器,PHP允许这样做。但是会出现新的问题 - 如果我重新定义文件包装器,我就不能再使用文件系统了。即使我的自定义包装器现在也无法加载文件,因为file://
是唯一可以处理文件的包装器。甚至SplFileObject
依赖于文件包装器,因此我无法以这种方式访问文件系统。
那么什么是最佳解决方案?
file://
来访问文件但是看起来PHP不允许这样 < / LI>
file://
包装器,但定义具有相同功能的新自定义包装器 - 技术上将文件包装器克隆到另一个,然后重新定义文件包装器。 再次,似乎PHP不允许这样做。我试图找到集成文件包装器是否已注册类 - 在这种情况下,我可以将它注册到另一个包装器,但它似乎不是。 另一个解决方法是什么?
fopen
,它总是恢复以前的文件包装,使用它然后再次重新注册自定义包装器 - 这不是一个好的解决方案,很多重新注册和嵌套函数的问题。我的问题......任何人都可以告诉我,如果有任何选择如何实现两个最佳解决方案之一或找到另一个可行的解决方案并且不会是讨厌的解决方法? < / p>