是否可以为类/接口定义单独的PSR-0/4路径,这些路径只能由包本身加载(而不是包含它的其他包)?
它的想法是阻止其他包错误地使用应该是包私有的类。
我意识到他们总是可以手动包含文件,而类加载器是全局的。目标不是阻止他们使用该类,而是明确表示他们现在不应该直接访问它,或者如果包的API发生更改。
使用案例:
假设包中有一个Person
类(已经发布和使用过)。当一个新版本的包到达时,我们不再希望它们调用new Person
,而是使用PersonFactory
(因为它必须与调用者不需要担心的人设置一些其他的东西)。
是的,您可以在更改日志中记录此信息。但是,IDE和静态分析器无法报告此情况。只有在将不正确初始化的Person提供给提供程序并且程序在运行时崩溃或抛出异常时才会发现该错误。
根据亚历山大的回应,这似乎是最合理的:
我看不出这是怎么可能的,因为自动加载器在第一次使用时将它们加载到它们定义的命名空间中。进入命名空间后,任何东西都可以通过访问该命名空间来使用它
PHP命名空间没有任何限制其他命名空间可以访问它们的方式,所以你的答案可能是否定的。
你可以做的是把你的私有类放在一个命名空间中,告诉开发人员他们是私有的:
use yourpackage\private\SomeClass;
它不会阻止它们,但它可以表明它们不应该这样做。
我不认为这是可能的。 spl_autoload_register()只接受$ class作为参数。您不能仅为部分应用程序注册自动加载。此外,无法知道哪个类调用或创建其他类的对象。即使您编写了自己的自动加载器,也无法获得所需的所有信息。
如果您希望保护代码,请查看PHP extensions。
我不确定这是你在说什么,但是当关键字和接口在命名空间中时,php关键字private和protected应该有所帮助