【问题标题】:PHP 7.1: Get file path from namespacePHP 7.1:从命名空间获取文件路径
【发布时间】:2018-03-15 06:59:42
【问题描述】:

我有一个项目。我需要获取包中文件的内容。我可以做到这一点:

file_get_contents('../../vendor/{vendor}/{package}/src/
    {directory}/{sub-directory}/class.php');

或者,我可以用“简单的方法”来做到这一点,我很确定这是不可能的。

namespace MyVendor\MyProject;

use TheirVendor\TheirPackage\TheirClass;

class MyObject
{
    public function myFunction()
    {
        return file_get_contents(TheirClass);
    }
}

这(或类似的)可能吗?

【问题讨论】:

  • 所以... Vendor\Package\Class => Vendor/Package/Class.php?
  • 有一个描述这个的psr
  • 文件路径到底是什么?不完全理解
  • @Federkun 得到了技术答案,但我想知道为什么你想这样做。对我来说听起来像是XY problem
  • 感谢大家的反馈。我已经根据该反馈完全改写了这些问题。 @ceejayoz,如果这听起来像是 XY 问题,我深表歉意,这只是一个例子。再次感谢您的反馈。

标签: php php-7.1


【解决方案1】:

您可以使用ReflectionClass instance and its getFileName() method 获取声明类的位置的文件名:

$reflector = new ReflectionClass(\Vendor\Package\Class::class);
echo $reflector->getFileName();

【讨论】:

  • 哦哦,优雅。
  • @ceejayoz PHP 的反射套件可能是它的一大优点。
  • 干得好@Marty。你真棒。确实推荐了一点来匹配所提出问题的重写。我总是忘记 ReflectionClass 以及它可以做什么。
  • 谢谢@JoshBruce,我确实看到了那个编辑,但是从有人遇到这个线程阅读标题然后快速导航到接受的答案的角度来看,我认为这可能会使事情变得过于复杂:-)
  • 看起来我没有将“Link”变成“TheirClass”。哎呀。
【解决方案2】:

您可以使用__NAMESPACE__ 全局,然后将反斜杠替换为适当的目录分隔符,然后使用__FILE__ 全局附加文件名

$ns = str_replace( __NAMESPACE__, DIRECTORY_SEPARATOR, '\\' );
$path = $ns.DIRECTORY_SEPARATOR.__FILE__;

然后用它做你想做的事。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-19
    • 1970-01-01
    • 2012-09-02
    • 2011-11-16
    • 2011-05-29
    • 2019-06-08
    • 1970-01-01
    • 2012-01-21
    相关资源
    最近更新 更多