PHP 5.3.0 compatibility changes
diff --git a/system/codeigniter/CodeIgniter.php b/system/codeigniter/CodeIgniter.php
index 68f6c75..b78736a 100644
--- a/system/codeigniter/CodeIgniter.php
+++ b/system/codeigniter/CodeIgniter.php
@@ -56,8 +56,8 @@
  *  Define a custom error handler so we can log PHP errors
  * ------------------------------------------------------
  */
-set_error_handler('_exception_handler');
-set_magic_quotes_runtime(0); // Kill magic quotes
+//set_error_handler('_exception_handler');
+@set_magic_quotes_runtime(0); // Kill magic quotes
 
 /*
  * ------------------------------------------------------
@@ -130,7 +130,7 @@
  *  Note: The Loader class needs to be included first
  *
  */
-if (floor(phpversion()) < 5)
+if ( ! is_php(5))
 {
 	load_class('Loader', FALSE);
 	require(BASEPATH.'codeigniter/Base4'.EXT);
diff --git a/system/codeigniter/Common.php b/system/codeigniter/Common.php
index f45c85c..1ffed6a 100644
--- a/system/codeigniter/Common.php
+++ b/system/codeigniter/Common.php
@@ -150,17 +150,35 @@
 	if ($is_subclass == TRUE)
 	{
 		$name = config_item('subclass_prefix').$class;
-		$objects[$class] =& new $name();
+
+		$objects[$class] =& instantiate_class(new $name());
 		return $objects[$class];
 	}
 
 	$name = ($class != 'Controller') ? 'CI_'.$class : $class;
-	
-	$objects[$class] =& new $name();
+
+	$objects[$class] =& instantiate_class(new $name());
 	return $objects[$class];
 }
 
 /**
+ * Instantiate Class
+ *
+ * Returns a new class object by reference, used by load_class() and the DB class.
+ * Required to retain PHP 4 compatibility and also not make PHP 5.3 cry.
+ *
+ * Use: $obj =& instantiate_class(new Foo());
+ * 
+ * @access	public
+ * @param	object
+ * @return	object
+ */
+function &instantiate_class(&$class_object)
+{
+	return $class_object;
+}
+
+/**
 * Loads the main config.php file
 *
 * @access	private
diff --git a/system/database/DB.php b/system/database/DB.php
index efe1d38..0f734d7 100644
--- a/system/database/DB.php
+++ b/system/database/DB.php
@@ -130,7 +130,7 @@
 
 	// Instantiate the DB adapter
 	$driver = 'CI_DB_'.$params['dbdriver'].'_driver';
-	$DB =& new $driver($params);
+	$DB =& instantiate_class(new $driver($params));
 	
 	if ($DB->autoinit == TRUE)
 	{
diff --git a/system/libraries/Loader.php b/system/libraries/Loader.php
index d615a13..781c83c 100644
--- a/system/libraries/Loader.php
+++ b/system/libraries/Loader.php
@@ -252,7 +252,7 @@
 		require_once(BASEPATH.'database/drivers/'.$CI->db->dbdriver.'/'.$CI->db->dbdriver.'_utility'.EXT);
 		$class = 'CI_DB_'.$CI->db->dbdriver.'_utility';
 
-		$CI->dbutil =& new $class();
+		$CI->dbutil =& instantiate_class(new $class());
 
 		$CI->load->_ci_assign_to_models();
 	}
diff --git a/system/libraries/Profiler.php b/system/libraries/Profiler.php
index 98cec06..ecd0e70 100644
--- a/system/libraries/Profiler.php
+++ b/system/libraries/Profiler.php
@@ -103,11 +103,11 @@
 	function _compile_queries()
 	{
 		$dbs = array();
-		
+
 		// Let's determine which databases are currently connected to
 		foreach (get_object_vars($this->CI) as $CI_object)
 		{
-			if ( is_subclass_of(get_class($CI_object), 'CI_DB') )
+			if (is_object($CI_object) && is_subclass_of(get_class($CI_object), 'CI_DB') )
 			{
 				$dbs[] = $CI_object;
 			}
diff --git a/system/libraries/URI.php b/system/libraries/URI.php
index efc7a18..68b6780 100644
--- a/system/libraries/URI.php
+++ b/system/libraries/URI.php
@@ -186,7 +186,9 @@
 	{
 		if ($str != '' && $this->config->item('permitted_uri_chars') != '' && $this->config->item('enable_query_strings') == FALSE)
 		{
-			if ( ! preg_match("|^[".preg_quote($this->config->item('permitted_uri_chars'))."]+$|i", $str))
+			// preg_quote() in PHP 5.3 escapes -, so the str_replace() and addition of - to preg_quote() is to maintain backwards
+			// compatibility as many are unaware of how characters in the permitted_uri_chars will be parsed as a regex pattern
+			if ( ! preg_match("|^[".str_replace(array('\\-', '\-'), '-', preg_quote($this->config->item('permitted_uri_chars'), '-'))."]+$|i", $str))
 			{
 				show_error('The URI you submitted has disallowed characters.', 400);
 			}