Added type-hint 'array' for $onlyKeys because this should only be an array.
[core.git] / inc / classes / main / class_BaseFrameworkSystem.php
index bdc442eee3ad0b3ea47207a2eed6ff01bf56ea44..79a60abeb3d09d1622ad580dfb3acf70541c9191 100644 (file)
@@ -169,12 +169,12 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
        private $wrapperInstance = NULL;
 
        /**
-        * Thousands seperator
+        * Thousands separator
         */
        private $thousands = '.'; // German
 
        /**
-        * Decimal seperator
+        * Decimal separator
         */
        private $decimals  = ','; // German
 
@@ -251,7 +251,9 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
        const EXCEPTION_DATABASE_UPDATED_NOT_ALLOWED = 0x039;
        const EXCEPTION_FILTER_CHAIN_INTERCEPTED     = 0x040;
 
-       // Hexadecimal->Decimal translation array
+       /**
+        * Hexadecimal->Decimal translation array
+        */
        private static $hexdec = array(
                '0' => 0,
                '1' => 1,
@@ -271,7 +273,9 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
                'f' => 15
        );
 
-       // Decimal->hexadecimal translation array
+       /**
+        * Decimal->hexadecimal translation array
+        */
        private static $dechex = array(
                 0 => '0',
                 1 => '1',
@@ -291,6 +295,11 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
                15 => 'f'
        );
 
+       /**
+        * Startup time in miliseconds
+        */
+       private static $startupTime = 0;
+
        /**
         * Protected super constructor
         *
@@ -304,12 +313,18 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
                // Set configuration instance if no registry ...
                if (!$this instanceof Register) {
                        // ... because registries doesn't need to be configured
-                       $this->setConfigInstance(FrameworkConfiguration::getInstance());
+                       $this->setConfigInstance(FrameworkConfiguration::getSelfInstance());
+               } // END - if
+
+               // Is the startup time set? (0 cannot be true anymore)
+               if (self::$startupTime == 0) {
+                       // Then set it
+                       self::$startupTime = microtime(true);
                } // END - if
        }
 
        /**
-        * Destructor reached...
+        * Destructor for all classes
         *
         * @return      void
         */
@@ -346,13 +361,29 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
                } elseif (is_array($args)) {
                        // Some arguments are there
                        foreach ($args as $arg) {
-                               // Add the type
-                               $argsString .= $this->replaceControlCharacters($arg) . ' (' . gettype($arg);
+                               // Add the value itself if not array. This prevents 'array to string conversion' message
+                               if (is_array($arg)) {
+                                       $argsString .= 'Array';
+                               } else {
+                                       $argsString .= $arg;
+                               }
+
+                               // Add data about the argument
+                               $argsString .= ' (' . gettype($arg);
 
-                               // Add length if type is string
                                if (is_string($arg)) {
+                                       // Add length for strings
                                        $argsString .= ', '.strlen($arg);
-                               } // END - if
+                               } elseif (is_array($arg)) {
+                                       // .. or size if array
+                                       $argsString .= ', '.count($arg);
+                               } elseif ($arg === true) {
+                                       // ... is boolean 'true'
+                                       $argsString .= ', true';
+                               } elseif ($arg === false) {
+                                       // ... is boolean 'true'
+                                       $argsString .= ', false';
+                               }
 
                                // Closing bracket
                                $argsString .= '), ';
@@ -375,7 +406,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
                ));
 
                // Return nothing
-               return null;
+               return NULL;
        }
 
        /**
@@ -690,7 +721,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
        /**
         * Setter for the real class name
         *
-        * @param               $realClass      Class name (string)
+        * @param       $realClass      Class name (string)
         * @return      void
         */
        public final function setRealClass ($realClass) {
@@ -702,11 +733,11 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
        }
 
        /**
-        * Checks wether an object equals this object. You should overwrite this
+        * Checks whether an object equals this object. You should overwrite this
         * method to implement own equality checks
         *
         * @param       $objectInstance         An instance of a FrameworkInterface object
-        * @return      $equals                         Wether both objects equals
+        * @return      $equals                         Whether both objects equals
         */
        public function equals (FrameworkInterface $objectInstance) {
                // Now test it
@@ -733,21 +764,21 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
 
        /**
         * Formats computer generated price values into human-understandable formats
-        * with thousand and decimal seperators.
+        * with thousand and decimal separators.
         *
         * @param       $value          The in computer format value for a price
         * @param       $currency       The currency symbol (use HTML-valid characters!)
         * @param       $decNum         Number of decimals after commata
         * @return      $price          The for the current language formated price string
-        * @throws      MissingDecimalsThousandsSeperatorException      If decimals or
-        *                                                                                              thousands seperator
+        * @throws      MissingDecimalsThousandsSeparatorException      If decimals or
+        *                                                                                              thousands separator
         *                                                                                              is missing
         */
        public function formatCurrency ($value, $currency = '€', $decNum = 2) {
                // Are all required attriutes set?
                if ((!isset($this->decimals)) || (!isset($this->thousands))) {
                        // Throw an exception
-                       throw new MissingDecimalsThousandsSeperatorException($this, self::EXCEPTION_ATTRIBUTES_ARE_MISSING);
+                       throw new MissingDecimalsThousandsSeparatorException($this, self::EXCEPTION_ATTRIBUTES_ARE_MISSING);
                } // END - if
 
                // Cast the number
@@ -784,8 +815,8 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
        /**
         * Appends a trailing slash to a string
         *
-        * @param       $str            A string (maybe) without trailing slash
-        * @return      $str            A string with an auto-appended trailing slash
+        * @param       $str    A string (maybe) without trailing slash
+        * @return      $str    A string with an auto-appended trailing slash
         */
        public final function addMissingTrailingSlash ($str) {
                // Is there a trailing slash?
@@ -800,7 +831,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
        /**
         * Private getter for file IO instance
         *
-        * @return      $fileIoInstance An instance to the file I/O sub-system
+        * @return      $fileIoInstance         An instance to the file I/O sub-system
         */
        protected final function getFileIoInstance () {
                return $this->fileIoInstance;
@@ -809,7 +840,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
        /**
         * Setter for file I/O instance
         *
-        * @param       $fileIoInstance An instance to the file I/O sub-system
+        * @param       $fileIoInstance         An instance to the file I/O sub-system
         * @return      void
         */
        public final function setFileIoInstance (FileIoHandler $fileIoInstance) {
@@ -878,7 +909,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
                ApplicationEntryPoint::app_die(sprintf("<div class=\"debug_header\">%s debug output:</div><div class=\"debug_content\">%s</div>\nLoaded includes: <div class=\"debug_include_list\">%s</div>",
                        $this->__toString(),
                        $content,
-                       ClassLoader::getInstance()->getPrintableIncludeList()
+                       ClassLoader::getSelfInstance()->getPrintableIncludeList()
                ));
        }
 
@@ -891,9 +922,9 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
        protected function replaceControlCharacters ($str) {
                // Replace them
                $str = str_replace(
-                       "\r", '[r]', str_replace(
-                       "\n", '[n]', str_replace(
-                       "\t", '[t]',
+                       chr(13), '[r]', str_replace(
+                       chr(10), '[n]', str_replace(
+                       chr(9) , '[t]',
                        $str
                )));
 
@@ -925,7 +956,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
                // Is the extra message given?
                if (!empty($message)) {
                        // Then add it as well
-                       $stubMessage .= sprintf(" Message: <span id=\"stub_message\">%s</span>", $message);
+                       $stubMessage .= sprintf(' Message: <span id="stub_message">%s</span>', $message);
                } // END - if
 
                // Debug instance is there?
@@ -934,7 +965,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
                        $this->debugOutput($stubMessage);
                } else {
                        // Trigger an error
-                       trigger_error($stubMessage . "<br />\n");
+                       trigger_error($stubMessage . '<br />' + chr(10));
                }
        }
 
@@ -951,17 +982,17 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
                        printf("Message: %s<br />\n", $message);
                } // END - if
 
-               print("<pre>\n");
+               print('<pre>');
                debug_print_backtrace();
-               print("</pre>");
+               print('</pre>');
                exit();
        }
 
        /**
-        * Outputs a debug message wether to debug instance (should be set!) or dies with or pints the message
+        * Outputs a debug message whether to debug instance (should be set!) or dies with or pints the message
         *
         * @param       $message        Message we shall send out...
-        * @param       $doPrint        Wether we shall print or die here which first is the default
+        * @param       $doPrint        Whether we shall print or die here which first is the default
         * @return      void
         */
        public function debugOutput ($message, $doPrint = true) {
@@ -980,7 +1011,14 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
                } else {
                        // Put directly out
                        if ($doPrint === true) {
-                               print($message);
+                               // Are debug times enabled?
+                               if ($this->getConfigInstance()->getConfigEntry('debug_output_timings') == 'Y') {
+                                       // Output it first
+                                       print($this->getPrintableExecutionTime());
+                               } // END - if
+
+                               // Print message
+                               print($message . chr(10));
                        } else {
                                // DO NOT REWRITE THIS TO app_die() !!!
                                die($message);
@@ -1041,7 +1079,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
                // Init the code with error message
                if (is_array($errorArray)) {
                        // Get error infos
-                       $markedCode = sprintf("<div id=\"error_header\">File: <span id=\"error_data\">%s</span>, Line: <span id=\"error_data\">%s</span>, Message: <span id=\"error_data\">%s</span>, Type: <span id=\"error_data\">%s</span></div>",
+                       $markedCode = sprintf('<div id="error_header">File: <span id="error_data">%s</span>, Line: <span id="error_data">%s</span>, Message: <span id="error_data">%s</span>, Type: <span id="error_data">%s</span></div>',
                                basename($errorArray['file']),
                                $errorArray['line'],
                                $errorArray['message'],
@@ -1050,9 +1088,9 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
                } // END - if
 
                // Add line number to the code
-               foreach (explode("\n", $phpCode) as $lineNo => $code) {
+               foreach (explode(chr(10), $phpCode) as $lineNo => $code) {
                        // Add line numbers
-                       $markedCode .= sprintf("<span id=\"code_line\">%s</span>: %s\n",
+                       $markedCode .= sprintf('<span id="code_line">%s</span>: %s' + chr(10),
                                ($lineNo + 1),
                                htmlentities($code, ENT_QUOTES)
                        );
@@ -1280,10 +1318,10 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
        }
 
        /**
-        * Checks wether the given PHP extension is loaded
+        * Checks whether the given PHP extension is loaded
         *
         * @param       $phpExtension   The PHP extension we shall check
-        * @return      $isLoaded       Wether the PHP extension is loaded
+        * @return      $isLoaded       Whether the PHP extension is loaded
         */
        public final function isPhpExtensionLoaded ($phpExtension) {
                // Is it loaded?
@@ -1367,7 +1405,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
        /**
         * Idles (sleeps) for given milliseconds
         *
-        * @return      $hasSlept       Wether it goes fine
+        * @return      $hasSlept       Whether it goes fine
         */
        public function idle ($milliSeconds) {
                // Sleep is fine by default
@@ -1381,8 +1419,10 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
                        // New PHP 5.1.0 function found, ignore errors
                        $hasSlept = @time_sleep_until($sleepUntil);
                } else {
-                       // My Sun Station doesn't have that function even with latest PHP
-                       // package. :(
+                       /*
+                        * My Sun station doesn't have that function even with latest PHP
+                        * package. :(
+                        */
                        usleep($milliSeconds * 1000);
                }
 
@@ -1640,10 +1680,10 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
        /**
         * Setter for handler instance
         *
-        * @param       $handlerInstance        A Networkable instance
+        * @param       $handlerInstance        An instance of a Handleable class
         * @return      void
         */
-       protected final function setHandlerInstance (Networkable $handlerInstance) {
+       protected final function setHandlerInstance (Handleable $handlerInstance) {
                $this->handlerInstance = $handlerInstance;
        }
 
@@ -1866,10 +1906,10 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
        }
 
        /**
-        * Checks wether the given encoded data was encoded with Base64
+        * Checks whether the given encoded data was encoded with Base64
         *
         * @param       $encodedData    Encoded data we shall check
-        * @return      $isBase64               Wether the encoded data is Base64
+        * @return      $isBase64               Whether the encoded data is Base64
         */
        protected function isBase64Encoded ($encodedData) {
                // Determine it
@@ -1905,7 +1945,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
         * @param       $onlyKeys                       Only use these keys for a cache key
         * @return      $cacheKey                       A cache key suitable for lookup/storage purposes
         */
-       protected function getCacheKeyByCriteria (Criteria $criteriaInstance, $onlyKeys = array()) {
+       protected function getCacheKeyByCriteria (Criteria $criteriaInstance, array $onlyKeys = array()) {
                // Generate it
                $cacheKey = sprintf("%s@%s",
                        $this->__toString(),
@@ -1916,6 +1956,73 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
                //* NOISY-DEBUG: */ $this->debugOutput($this->__toString() . ': cacheKey=' . $cacheKey);
                return $cacheKey;
        }
+
+       /**
+        * Getter for startup time in miliseconds
+        *
+        * @return      $startupTime    Startup time in miliseconds
+        */
+       protected function getStartupTime () {
+               return self::$startupTime;
+       }
+
+       /**
+        * "Getter" for a printable currently execution time in nice braces
+        *
+        * @return      $executionTime  Current execution time in nice braces
+        */
+       protected function getPrintableExecutionTime () {
+               // Caculate the execution time
+               $executionTime = microtime(true) - $this->getStartupTime();
+
+               // Pack it in nice braces
+               $executionTime = sprintf('[ %01.5f ] ', $executionTime);
+
+               // And return it
+               return $executionTime;
+       }
+
+       /**
+        * Hashes a given string with a simple but stronger hash function (no salts)
+        *
+        * @param       $str    The string to be hashed
+        * @return      $hash   The hash from string $str
+        */
+       public function hashString ($str) {
+               // Hash given string with (better secure) hasher
+               $hash = mhash(MHASH_SHA256, $str);
+
+               // Return it
+               return $hash;
+       }
+
+       /**
+        * Checks whether the given number is really a number (only chars 0-9).
+        *
+        * @param       $num            A string consisting only chars between 0 and 9
+        * @param       $castValue      Whether to cast the value to double. Do only use this to secure numbers from Requestable classes.
+        * @param       $assertMismatch         Whether to assert mismatches
+        * @return      $ret            The (hopefully) secured numbered value
+        */
+       public function bigintval ($num, $castValue = true, $assertMismatch = false) {
+               // Filter all numbers out
+               $ret = preg_replace('/[^0123456789]/', '', $num);
+
+               // Shall we cast?
+               if ($castValue === true) {
+                       // Cast to biggest numeric type
+                       $ret = (double) $ret;
+               } // END - if
+
+               // Assert only if requested
+               if ($assertMismatch === true) {
+                       // Has the whole value changed?
+                       assert(('' . $ret . '' != '' . $num . '') && (!is_null($num)));
+               } // END - if
+
+               // Return result
+               return $ret;
+       }
 }
 
 // [EOF]