CI源码分析-Config.php


config =& get_config();

        // Set the base_url automatically if none was provided
        if (empty($this->config['base_url']))
        {
            // The regular expression is only a basic validation for a valid "Host" header.
            // It's not exhaustive, only checks for valid characters.
            if (isset($_SERVER['HTTP_HOST']) && preg_match('/^((\[[0-9a-f:]+\])|(\d{1,3}(\.\d{1,3}){3})|[a-z0-9\-\.]+)(:\d+)?$/i', $_SERVER['HTTP_HOST']))
            {
                $base_url = (is_https() ? 'https' : 'http').'://'.$_SERVER['HTTP_HOST']
                    .substr($_SERVER['SCRIPT_NAME'], 0, strpos($_SERVER['SCRIPT_NAME'], basename($_SERVER['SCRIPT_FILENAME'])));
            }
            else
            {
                $base_url = 'http://localhost/';
            }

            $this->set_item('base_url', $base_url);
        }

        log_message('info', 'Config Class Initialized');
    }

函数:string basename ( string $path [, string $suffix ] ) 给出一个包含有指向一个文件的全路径的字符串,本函数返回基本的文件名。

函数:mixed strpos ( string $haystack , mixed $needle [, int $offset = 0 ] ) 返回 needle 在 haystack 中首次出现的数字位置。同时注意字符串位置是从0开始,而不是从1开始的。

$_SERVER[‘SERVER_NAME’] gives the value of the server name as defined
in host configuration (i.e for Apache the Apache .conf file).

$_SERVER[‘HTTP_HOST’] gives you the domain name through which the
current request is being fulfilled and is more directly related to the
request.

HTTP_HOST is typically more useful in most applications in that it
relates directly to the request, whereas SERVER_NAME could return
whatever value is in the conf file and doesn’t tell you anything about
the request at all.

I will give you an example of how HTTP_HOST might differ from
SERVER_NAME. Say you have an host defined in Apache with ServerName of
domain.com and an IP address of 1.2.3.4.

Let’s look at two incoming request URL’s and show the difference
between these variables:

http://www.domain.com HTTP_HOST = www.domain.com SERVER_NAME =
domain.com

http://1.2.3.4 HTTP_HOST = 1.2.3.4 SERVER_NAME = domain.com So again,
HTTP_HOST is tied more to the request, whereas SERVER_NAME is
determined by server configuration.


    // --------------------------------------------------------------------

    /**
     * Load Config File
     *
     * @param    string    $file            Configuration file name
     * @param    bool    $use_sections        Whether configuration values should be loaded into their own section
     * @param    bool    $fail_gracefully    Whether to just return FALSE or display an error message
     * @return    bool    TRUE if the file was loaded correctly or FALSE on failure
     */
    public function load($file = '', $use_sections = FALSE, $fail_gracefully = FALSE)
    {
        $file = ($file === '') ? 'config' : str_replace('.php', '', $file);
        $loaded = FALSE;

        foreach ($this->_config_paths as $path)
        {
            foreach (array($file, ENVIRONMENT.DIRECTORY_SEPARATOR.$file) as $location)
            {
                $file_path = $path.'config/'.$location.'.php';
                if (in_array($file_path, $this->is_loaded, TRUE))
                {
                    return TRUE;
                }

                if ( ! file_exists($file_path))
                {
                    continue;
                }

                include($file_path);

                if ( ! isset($config) OR ! is_array($config))
                {
                    if ($fail_gracefully === TRUE)
                    {
                        return FALSE;
                    }

                    show_error('Your '.$file_path.' file does not appear to contain a valid configuration array.');
                }

                //分离不同文件的配置进行存储。
                if ($use_sections === TRUE)
                {
                    $this->config[$file] = isset($this->config[$file])
                        ? array_merge($this->config[$file], $config)
                        : $config;
                }
                else
                {
                    $this->config = array_merge($this->config, $config);
                }

                $this->is_loaded[] = $file_path;
                $config = NULL;
                $loaded = TRUE;
                log_message('debug', 'Config file loaded: '.$file_path);
            }
        }

        if ($loaded === TRUE)
        {
            return TRUE;
        }
        elseif ($fail_gracefully === TRUE)
        {
            return FALSE;
        }

        show_error('The configuration file '.$file.'.php does not exist.');
    }

    // --------------------------------------------------------------------

    /**
     * Fetch a config file item
     * 获取指定条目
     *
     * @param    string    $item    Config item name
     * @param    string    $index    Index name
     * @return    string|null    The configuration item or NULL if the item doesn't exist
     */
    public function item($item, $index = '')
    {
        if ($index == '')
        {
            return isset($this->config[$item]) ? $this->config[$item] : NULL;
        }

        return isset($this->config[$index], $this->config[$index][$item]) ? $this->config[$index][$item] : NULL;
    }

    // --------------------------------------------------------------------

    /**
     * Fetch a config file item with slash appended (if not empty)
     * 获取带有‘/’的指定条目
     *
     * @param    string        $item    Config item name
     * @return    string|null    The configuration item or NULL if the item doesn't exist
     */
    public function slash_item($item)
    {
        if ( ! isset($this->config[$item]))
        {
            return NULL;
        }
        elseif (trim($this->config[$item]) === '')
        {
            return '';
        }

        return rtrim($this->config[$item], '/').'/';
    }

    // --------------------------------------------------------------------

    /**
     * Site URL
     * 我们经常通过url_helper的site_url获得我们在项目中想要的路径,其实真正执行的是Config::site_url()这个方法。
     *
     * Returns base_url . index_page [. uri_string]
     *
     * @uses    CI_Config::_uri_string()
     *
     * @param    string|string[]    $uri    URI string or an array of segments
     * @param    string    $protocol
     * @return    string
     */
    public function site_url($uri = '', $protocol = NULL)
    {
        $base_url = $this->slash_item('base_url');

        if (isset($protocol))
        {
            // For protocol-relative links
            if ($protocol === '')
            {
                $base_url = substr($base_url, strpos($base_url, '//'));
            }
            else
            {
                $base_url = $protocol.substr($base_url, strpos($base_url, '://'));
            }
        }

        if (empty($uri))
        {
            return $base_url.$this->item('index_page');
        }

        $uri = $this->_uri_string($uri);

        if ($this->item('enable_query_strings') === FALSE)
        {
            $suffix = isset($this->config['url_suffix']) ? $this->config['url_suffix'] : '';

            if ($suffix !== '')
            {
                if (($offset = strpos($uri, '?')) !== FALSE)
                {
                    $uri = substr($uri, 0, $offset).$suffix.substr($uri, $offset);
                }
                else
                {
                    $uri .= $suffix;
                }
            }

            return $base_url.$this->slash_item('index_page').$uri;
        }
        elseif (strpos($uri, '?') === FALSE)
        {
            $uri = '?'.$uri;
        }

        return $base_url.$this->item('index_page').$uri;
    }

    // -------------------------------------------------------------

    /**
     * Base URL
     * 
     *
     * Returns base_url [. uri_string]
     *
     * @uses    CI_Config::_uri_string()
     *
     * @param    string|string[]    $uri    URI string or an array of segments
     * @param    string    $protocol
     * @return    string
     */
    public function base_url($uri = '', $protocol = NULL)
    {
        $base_url = $this->slash_item('base_url');

        if (isset($protocol))
        {
            // For protocol-relative links
            if ($protocol === '')
            {
                $base_url = substr($base_url, strpos($base_url, '//'));
            }
            else
            {
                $base_url = $protocol.substr($base_url, strpos($base_url, '://'));
            }
        }

        return $base_url.ltrim($this->_uri_string($uri), '/');
    }

    // -------------------------------------------------------------

    /**
     * Build URI string
     * 按当前规定路由格式,返回正确的uri_string.
     *
     * @used-by    CI_Config::site_url()
     * @used-by    CI_Config::base_url()
     *
     * @param    string|string[]    $uri    URI string or an array of segments
     * @return    string
     */
    protected function _uri_string($uri)
    {
        if ($this->item('enable_query_strings') === FALSE)
        {
            if (is_array($uri))
            {
                $uri = implode('/', $uri);
            }
            return trim($uri, '/');
        }
        elseif (is_array($uri))
        {
            return http_build_query($uri);
        }

        return $uri;
    }

    // --------------------------------------------------------------------

    /**
     * System URL
     *
     * @deprecated    3.0.0    Encourages insecure practices
     * @return    string
     */
    public function system_url()
    {
        $x = explode('/', preg_replace('|/*(.+?)/*$|', '\\1', BASEPATH));
        return $this->slash_item('base_url').end($x).'/';
    }

    // --------------------------------------------------------------------

    /**
     * Set a config file item
     *
     * @param    string    $item    Config item key
     * @param    string    $value    Config item value
     * @return    void
     */
    public function set_item($item, $value)
    {
        $this->config[$item] = $value;
    }

}

函数:http_build_query()使用给出的关联(或下标)数组生成一个经过 URL-encode 的请求字符串。
技巧:通过@deprecated 的形式声明函数已被废弃


文章作者: Fengit
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Fengit !
  目录