diff options
author | Andrey Andreev <narf@devilix.net> | 2016-10-28 17:34:05 +0200 |
---|---|---|
committer | Andrey Andreev <narf@devilix.net> | 2016-10-28 17:34:05 +0200 |
commit | 67b40a561111a5a65faa245cd4c575e8d945cfb8 (patch) | |
tree | 4c9d3c66d666f3a781299e11806a5ff1d11fc3ba /system/core/CodeIgniter.php | |
parent | df34b547c97ba1ce1ddb819495d299cb845a87de (diff) | |
parent | 499c6080cd41927df088206155e4055d4da3e58e (diff) |
Merge branch '3.1-stable' into develop
Resolved conflicts:
system/core/CodeIgniter.php
user_guide_src/source/changelog.rst
user_guide_src/source/conf.py
user_guide_src/source/installation/downloads.rst
user_guide_src/source/installation/upgrading.rst
user_guide_src/source/libraries/form_validation.rst
Diffstat (limited to 'system/core/CodeIgniter.php')
-rw-r--r-- | system/core/CodeIgniter.php | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/system/core/CodeIgniter.php b/system/core/CodeIgniter.php index e6ce13d81..66ed9ec8f 100644 --- a/system/core/CodeIgniter.php +++ b/system/core/CodeIgniter.php @@ -55,7 +55,7 @@ defined('BASEPATH') OR exit('No direct script access allowed'); * @var string * */ - define('CI_VERSION', '3.2.0-dev'); + const CI_VERSION = '3.2.0-dev'; /* * ------------------------------------------------------ @@ -416,10 +416,29 @@ if ( ! is_php('5.4')) $params = array($method, array_slice($URI->rsegments, 2)); $method = '_remap'; } - elseif ( ! is_callable(array($class, $method))) + elseif ( ! method_exists($class, $method)) { $e404 = TRUE; } + /** + * DO NOT CHANGE THIS, NOTHING ELSE WORKS! + * + * - method_exists() returns true for non-public methods, which passes the previous elseif + * - is_callable() returns false for PHP 4-style constructors, even if there's a __construct() + * - method_exists($class, '__construct') won't work because CI_Controller::__construct() is inherited + * - People will only complain if this doesn't work, even though it is documented that it shouldn't. + * + * ReflectionMethod::isConstructor() is the ONLY reliable check, + * knowing which method will be executed as a constructor. + */ + elseif ( ! is_callable(array($class, $method)) && strcasecmp($class, $method) === 0) + { + $reflection = new ReflectionMethod($class, $method); + if ( ! $reflection->isPublic() OR $reflection->isConstructor()) + { + $e404 = TRUE; + } + } } if ($e404) |