Composer and Packagist have fundamentally changed thephp package landscape by providing a central package registry. And a tool to easily install package listed in that registry and autoload them using PSR- 0 4. But the composer tooling can be used for more then just installing and autoloading files. We'll explore one of them in this post.


Utilizing composer's classloader to locate a class ― Cees-Jan Kiewiet's blog
Locating a file

For a project I need to parsed PHP classes and I'm using nikic/php-parser , which only accepts a string. (Fair enough it isn't it's responsibility to find a class for me.) Composer to the rescue!

Locating autoload.php

Now this is the hardest part: Locate the autoload.php file (which is just a intermediary file between you and the real autoload file). One can fairly safely assume that it is always located at vendor/autoload.php , but where that is relatively to your current file is the tricky part. In the package I'm working on the following code detects the location of autoload.php . First it tries ../vendor/autoload.php for when it is just the package, and ../../../vendor/autoload.php for when it is used in a project.

private function locateClassloader() { foreach ([ dirname(__DIR__) . DS . 'vendor' . DS . 'autoload.php', dirname(dirname(dirname(__DIR__))) . DS . 'autoload.php', ] as $path) { if (file_exists($path)) { return require $path; } } throw new RuntimeException('Unable to locate class loader'); } Locating the file we want to parse

Since we have the class loader from autoload.php we can utilize that to file a class we want to use by calling findFile , a method composer uses to a requested class for autoloading:

$classLocation = $this->locateClassloader()->findFile($classToFind);

We now have the location of the class, as found by Composer in $classLocation . Or false when it couldn't find it.

Bonus: Parsing the file

$ast = (new ParserFactory)->create(ParserFactory::PREFER_PHP7)->parse(file_get_contents($classLocation));

本文开发(php)相关术语:php代码审计工具 php开发工程师 移动开发者大会 移动互联网开发 web开发工程师 软件开发流程 软件开发工程师

主题: PHP
分页:12
转载请注明
本文标题:Utilizing composer's classloader to locate a class ― Cees-Jan Kiewiet's blog
本站链接:http://www.codesec.net/view/484639.html
分享请点击:


1.凡CodeSecTeam转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。
登录后可拥有收藏文章、关注作者等权限...
技术大类 技术大类 | 开发(php) | 评论(0) | 阅读(34)