From 75d5081bfbe6c9c056e859e2b455c9b44c2e5d6c Mon Sep 17 00:00:00 2001 From: Daniel Rudolf Date: Sun, 6 Mar 2016 20:06:24 +0100 Subject: [PATCH] Use scope isolated includes for plugins & config --- lib/Pico.php | 20 ++++++++++++++++++-- plugins/00-PicoDeprecated.php | 10 +++++++++- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/lib/Pico.php b/lib/Pico.php index 5ab4e7f..10465f2 100644 --- a/lib/Pico.php +++ b/lib/Pico.php @@ -398,10 +398,18 @@ class Pico */ protected function loadPlugins() { + // scope isolated require_once() + $includeClosure = function ($pluginFile) { + require_once($pluginFile); + }; + if (PHP_VERSION_ID >= 50400) { + $includeClosure = $includeClosure->bindTo(null); + } + $this->plugins = array(); $pluginFiles = $this->getFiles($this->getPluginsDir(), '.php'); foreach ($pluginFiles as $pluginFile) { - require_once($pluginFile); + $includeClosure($pluginFile); $className = preg_replace('/^[0-9]+-/', '', basename($pluginFile, '.php')); if (class_exists($className)) { @@ -508,7 +516,15 @@ class Pico { $config = null; if (file_exists($this->getConfigDir() . 'config.php')) { - require($this->getConfigDir() . 'config.php'); + // scope isolated require() + $includeClosure = function ($configFile) { + require($configFile); + }; + if (PHP_VERSION_ID >= 50400) { + $includeClosure = $includeClosure->bindTo(null); + } + + $includeClosure($this->getConfigDir() . 'config.php'); } $defaultConfig = array( diff --git a/plugins/00-PicoDeprecated.php b/plugins/00-PicoDeprecated.php index 1077800..c5d9850 100644 --- a/plugins/00-PicoDeprecated.php +++ b/plugins/00-PicoDeprecated.php @@ -165,10 +165,18 @@ class PicoDeprecated extends AbstractPicoPlugin protected function loadRootDirConfig(array &$realConfig) { if (file_exists($this->getRootDir() . 'config.php')) { + // scope isolated require() + $includeClosure = function ($configFile) { + require($configFile); + }; + if (PHP_VERSION_ID >= 50400) { + $includeClosure = $includeClosure->bindTo(null); + } + // config.php in Pico::$rootDir is deprecated // use config.php in Pico::$configDir instead $config = null; - require($this->getRootDir() . 'config.php'); + $includeClosure($this->getRootDir() . 'config.php'); if (is_array($config)) { if (isset($config['base_url'])) {