Version 1.x used customizable containers feature to store parsing results.
For example, in version 1.x when we wanted to retrieve user functions, we could either do :
Example 11.1. With standard container
<?php require_once 'Bartlett/PHP/Reflect/Autoload.php'; $source = '/path/to/source_file.php'; $options = array(); $reflect = new PHP_Reflect($options); $reflect->scan($source); $functions = $reflect->getFunctions(); // OR $functions = $reflect['functions'];
Example 11.2. With a non standard container
<?php require_once 'Bartlett/PHP/Reflect/Autoload.php'; $source = '/path/to/source_file.php'; $options = array('containers' => array('function' => 'userFunctions'); $reflect = new PHP_Reflect($options); $reflect->scan($source); $functions = $reflect->getUserFunctions(); // OR $functions = $reflect['userFunctions'];
In version 2.x, we have collections of data models that we can enumerate and exploit.
Example 11.3. Enumerate each user functions
<?php require_once 'vendor/autoload.php'; use Bartlett\Reflect; use Bartlett\Reflect\ProviderManager; use Bartlett\Reflect\Provider\SymfonyFinderProvider; use Symfony\Component\Finder\Finder; $finder = new Finder(); $finder->files() ->name('source_file.php') ->in('/path/to/'); // Identify Data Source $pm = new ProviderManager; $pm->set('Sample', new SymfonyFinderProvider($finder)); $reflect = new Reflect; $reflect->setProviderManager($pm); $reflect->parse(); // Exploit results foreach ($reflect->getPackages() as $package) { $functions = $package->getFunctions(); }