当前位置:  编程技术>php
本页文章导读:
    ▪php获取http请示的头信息的方法      在php手册中提供了现成的函数: getallheaders (PHP 4, PHP 5) getallheaders — Fetch all HTTP request headers 说明 array getallheaders ( void ) Fetches all HTTP headers from the current request. This function is an alias for apache_r.........
    ▪有关php中autoload的机制详解      有关php中autoload的机制详解,有需要的朋友可以参考下。 一、autoload机制 在使用PHP的OO模式开发系统时,通常大家习惯上将每个类的实现都存放在一个单独的文件里,这样会很容易实现对类进.........
    ▪php中将变量转换为数组的函数应用      在php中,函数compact()的作用与extract()正好相反,该函数使用给定的变量名创建一个数组,该数组键名是变量名,值是变量的值。任何与实际变量不一致的名字均将被忽略。给定变量名时,可以.........

[1]php获取http请示的头信息的方法
    来源: 互联网  发布时间: 2013-12-24

在php手册中提供了现成的函数:
getallheaders
(PHP 4, PHP 5)
getallheaders — Fetch all HTTP request headers

说明
array getallheaders ( void )
Fetches all HTTP headers from the current request.
This function is an alias for apache_request_headers(). Please read theapache_request_headers() documentation for more information on how this function works.

返回值
An associative array of all the HTTP headers in the current request, orFALSE on failure.

getallheaders()的例子:
 

代码如下:
<?php 
     
    foreach (getallheaders() as $name => $value) { 
        echo "$name: $value\n"; 
    } 
?>  
 

不过这个函数只能在apache环境下使用,iis或者nginx并不支持,可以通过自定义函数实现。
 

代码如下:
<?php  
    <span >if (!function_exists('getallheaders'))  
    { 
        function getallheaders()  
        { 
           foreach ($_SERVER as $name => $value)  
           { 
               if (substr($name, 0, 5) == 'HTTP_')  
               { 
                   $headers[str_replace()(' ', '-', ucwords(strtolower()(str_replace('_', ' ', substr($name, 5)))))] = $value; 
               } 
           } 
           return $headers; 
        } 
    }</span>  
?>  

检测下输出结果吧。
 

代码如下:
<?php 
print_r(getallheaders()); 
?>

获得结果:
   Array 
    ( 
        [Accept] => */* 
        [Accept-Language] => zh-cn 
        [Accept-Encoding] => gzip, deflate 
        [User-Agent] => Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727) 
        [Host] => localhost 
        [Connection] => Keep-Alive 
    ) 


    
[2]有关php中autoload的机制详解
    来源: 互联网  发布时间: 2013-12-24

有关php中autoload的机制详解,有需要的朋友可以参考下。

一、autoload机制
在使用PHP的OO模式开发系统时,通常大家习惯上将每个类的实现都存放在一个单独的文件里,这样会很容易实现对类进行复用,同时将来维护时也很便利,这也是OO设计的基本思想之一。

PHP5之前,如果需要使用一个类,只需要直接使用include/require将其包含进来即可。
下面是一个实际的例 子:
 

代码如下:
    /* Person.class.php */ 
    <?php 
        class Person { 
        public $name; 
        public $age; 
       
        function __construct ($name, $age) 
        { 
            $this->name = $name; 
            $this->age = $age; 
        } 
        } 
    ?> 
     
    /* no_autoload.php */ 
    <?php 
        require_once (”Person.class.php”); 
      
        $person = new Person(”Altair”, 6); 
        var_dump ($person); 
    ?> 

在这个例子中,no-autoload.php文件需要使用Person类,它使用了require_once将其包含,然后就可以直接使用Person类来实例化一个对象。
但随着项目规模的不断扩大,使用这种方式会带来一些隐含的问题:

如果一个PHP文件需要使用很多其它类,那么就需要很多的require/include语 句,这样有可能会造成遗漏或者包含进不必要的类文件。

如果大量的文件都需要使用其它的类,那么要保证每个文件都包含正确的类文件肯定是一个噩梦。

PHP5为这个问题提供了一个解决方案,这就是类的自动装载(autoload)机制。

autoload机制可以使得PHP程序有可能在使用类时才自动包含类文件,而不是一开始就将所有的类文件include进来,这种机制也称为lazy loading。

下面是使用autoload机制加载Person类的例子:
 

代码如下:
   /* autoload.php */ 
    <?php 
    function __autoload($classname) { 
        require_once ($classname . "class.php"); 
    } 
      
    $person = new Person(”Altair”, 6); 
    var_dump ($person); 
    ?> 

通常PHP5在使用一个类时,如果发现这个类没有加载,就会自动运行__autoload()函数,在这个函数中我们可以加载需要使用的类。

在我们这个简单 的例子中,我们直接将类名加上扩展名”.class.php”构成了类文件名,然后使用require_once将其加载。

从这个例子中,我们可以看出 autoload至少要做三件事情,

第一件事是根据类名确定类文件名;

第二件事是确定类文件所在的磁盘路径(在我们的例子是最简单的情况,类与调用它们的 PHP程序文件在同一个文件夹下);

第三件事是将类从磁盘文件中加载到系统中。第三步最简单,只需要使用include/require即可。

要实现第一 步,第二步的功能,必须在开发时约定类名与磁盘文件的映射方法,只有这样我们才能根据类名找到它对应的磁盘文件。

因此,当有大量的类文件 要包含的时候,我们只要确定相应的规则,然后在__autoload()函数中,将类名与实际的磁盘文件对应起来,就可以实现lazy loading的效果。

从这里我们也可以看出__autoload()函数的实现中最重要的是类名与实际的磁盘文件映射规则的实现。

 但现在问题来了,如果在一个系统的实现中,如果需要使用很多其它的类库,这些类库可能是由不同的开发人员编写的,其类名与实际的磁盘文件的映射规则不尽相同。这时如果要实现类库文件的自动加载,就必须在__autoload()函数中将所有的映射规则全部实现,这样的话__autoload()函数有可能会非常复杂,甚至无法实现。最后可能会导致__autoload()函数十分臃肿,这时即便能够实现,也会给将来的维护和系统效率带来很大的负面影响。在这种情况下,难道就没有更简单清晰的解决办法了吧?答案当然是:NO!

在看进一步的解决方法之前,我们先来看一下PHP中的autoload机制是如何实现的。

二、 PHP的autoload机制的实现

PHP在实例化一个对象时(实际上在实现接口, 使用类常数或类中的静态变量,调用类中的静态方法时都会如此),首先会在系统中查找该类(或接口)是否存在,如果不存在的话就尝试使用autoload机制来加载该类。

autoload机制的主要执行过程为:
(1) 检查执行器全局变量函数指针autoload_func是否为NULL。
(2) 如果autoload_func==NULL, 则查找系统中是否定义有__autoload()函数,如果没有,则报告错误并退出。
(3) 如果定义了__autoload()函数,则执行__autoload()尝试加载类,并返回加载结果。
(4) 如果autoload_func不为NULL,则直接执行autoload_func指针指向的函数用来加载类。注意此时并不检查__autoload()函数是否定义。

PHP提供了两种方法来实现自动装载机制:

一种我们前面已经提到过,是使用用户定义的__autoload()函数,这通常在PHP源程序中来实现;

另外一种就是设计一个函数,将autoload_func指针指向它,这通常使用C语言在PHP扩展中实现。

如果既实现了 __autoload()函数,又实现了autoload_func(将autoload_func指向某一PHP函数),那么只执行 autoload_func函数。

三、SPL autoload机制的实现

 SPL是Standard PHP Library(标准PHP库)的缩写。

它是PHP5引入的一个扩展库,其主要功能包括autoload机制的实现及包括各种Iterator接口或类。

SPL autoload机制的实现是通过将函数指针autoload_func指向自己实现的具有自动装载功能的函数来实现的。

SPL有两个不同的函数 spl_autoload, spl_autoload_call,通过将autoload_func指向这两个不同的函数地址来实现不同的自动加载机制。

spl_autoload 是SPL实现的默认的自动加载函数,它的功能比较简单。

它可以接收两个参数,第一个参数是$class_name,表示类名,第二个参 数$file_extensions是可选的,表示类文件的扩展名。可以在$file_extensions中指定多个扩展名,护展名之间用分号隔开即可;如果不指定的话,它将使用默认的扩展名.inc或.php。

spl_autoload首先将$class_name变为小写,然后在所有的 include path中搜索$class_name.inc或$class_name.php文件(如果不指定$file_extensions参数的话),如果找到,就加载该类文件。

你可以手动使用spl_autoload(”Person”, “.class.php”)来加载Person类。实际上,它跟require/include差不多,不同的它可以指定多个扩展名。

怎样让spl_autoload自动起作用呢,也就是将autoload_func指向spl_autoload?答案是使用 spl_autoload_register函数。在PHP脚本中第一次调用spl_autoload_register()时不使用任何参数,就可以将 autoload_func指向spl_autoload。

通过上面的说明我们知道,spl_autoload的功能比较简单,而且它是在SPL扩展中实现的,我们无法扩充它的功能。如果想实现自己的更灵活的自动加载机制怎么办呢?这时,spl_autoload_call函数闪亮登场了。

我们先看一下spl_autoload_call的实现有何奇妙之处。在SPL模块内部,有一个全局变量autoload_functions,它本质上是 一个HashTable,不过我们可以将其简单的看作一个链表,链表中的每一个元素都是一个函数指针,指向一个具有自动加载类功能的函数。 spl_autoload_call本身的实现很简单,只是简单的按顺序执行这个链表中每个函数,在每个函数执行完成后都判断一次需要的类是否已经加载, 如果加载成功就直接返回,不再继续执行链表中的其它函数。如果这个链表中所有的函数都执行完成后类还没有加载,spl_autoload_call就直接 退出,并不向用户报告错误。因此,使用了autoload机制,并不能保证类就一定能正确的自动加载,关键还是要看你的自动加载函数如何实现。

那么自动加载函数链表autoload_functions是谁来维护呢?

就是前面提到的spl_autoload_register函数。它可以将用户定 义的自动加载函数注册到这个链表中,并将autoload_func函数指针指向spl_autoload_call函数。我们也可以通过spl_autoload_unregister函数将已经注册的函数从autoload_functions链表 中删除。

上节说过,当autoload_func指针非空时,就不会自动执行__autoload()函数了,现在 autoload_func已经指向了spl_autoload_call,如果我们还想让__autoload()函数起作用应该怎么办呢?当然还是使 用spl_autoload_register(__autoload)调用将它注册到autoload_functions链表中。

现在回到第一节最后的问题,我们有了解决方案:根据每个类库不同的命名机制实现各自的自动加载函数,然后使用spl_autoload_register分别将其注册到SPL自动加载函数队列中就可了。这样我们就不用维护一个非常复杂的__autoload函数了。

四、autoload效率问题及对策

使用autoload机制时,很多人的第一反应就是使用autoload会降低系统效率,甚至有人干脆提议为了效率不要使用autoload。

在我们了解了autoload实现的原理后,我们知道autoload机制本身并不是影响系统效率的原因,甚至它还有可能提高系统效率,因为它不会将不需要的类加载到系统中。

那么为什么很多人都有一个使用autoload会降低系统效率的印象呢?

实际上,影响autoload机制效率本身恰恰是用户设计的自动加载函数。

如果它不能高效的将类名与实际的磁盘文件(注意,这里指实际的磁盘文件,而不仅仅是文件名)对应起来,系统将不得不做大量的文件是 否存在(需要在每个include path中包含的路径中去寻找)的判断,而判断文件是否存在需要做磁盘I/O操作,众所周知磁盘I/O操作的效率很低,因此这才是使得autoload机 制效率降低的罪魁祸首!

因此,我们在系统设计时,需要定义一套清晰的将类名与实际磁盘文件映射的机制。这个规则越简单越明确,autoload机制的效率就越高。

结论:autoload机制并不是天然的效率低下,只有滥用autoload,设计不好的自动装载函数才会导致其效率的降低。


    
[3]php中将变量转换为数组的函数应用
    来源: 互联网  发布时间: 2013-12-24

在php中,函数compact()的作用与extract()正好相反,该函数使用给定的变量名创建一个数组,该数组键名是变量名,值是变量的值。任何与实际变量不一致的名字均将被忽略。给定变量名时,可以使用字符串,也可以使用包含变量名的数组,compact()可以递归地处理。

来看一个使用compact()函数的例子。
 

代码如下:
<?php
//给定变量
$city = "菏泽";
$province = "山东省";
$project = "PHP Program";
$location_vars = array("province", "city");
//创建数组
$result = compact("project", "nothing", "location_vars");
print_r($result);
?>

在以上的程序中,因为并不存在名字是"nothing"的变量,因此程序的输出结果如下:
Array
(
   [project] => PHP Program
   [province] => 山东省
   [city] => 菏泽
)


    
最新技术文章:
▪PHP函数microtime()时间戳的定义与用法
▪PHP单一入口之apache配置内容
▪PHP数组排序方法总结(收藏)
▪php数组排序方法大全(脚本学堂整理奉献)
▪php数组排序的几个函数(附实例)
▪php二维数组排序(实例)
▪php根据键值对二维数组排序的小例子
▪php验证码(附截图)
▪php数组长度的获取方法(三个实例)
▪php获取数组长度的方法举例
▪判断php数组维度(php数组长度)的方法
▪php获取图片的exif信息的示例代码
▪PHP 数组key长度对性能的影响实例分析
▪php函数指定默认值的方法示例
▪php提交表单到当前页面、提交表单后页面重定...
▪php四舍五入的三种实现方法
▪php获得数组长度(元素个数)的方法
▪php日期函数的简单示例代码
▪php数学函数的简单示例代码
▪php字符串函数的简单示例代码
▪php文件下载代码(多浏览器兼容、支持中文文...
▪php实现文件下载、支持中文文件名的示例代码...
▪php文件下载(防止中文文件名乱码)的示例代码
▪解决PHP文件下载时中文文件名乱码的问题
▪php数组去重(一维、二维数组去重)的简单示例
▪php小数点后取两位的三种实现方法
▪php Redis 队列服务的简单示例
▪PHP导出excel时数字变为科学计数的解决方法
▪PHP数组根据值获取Key的简单示例
▪php数组去重的函数代码示例
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3