PHP $_SERVER变量使用方法详解

 更新时间:2016年11月25日 15:01  点击:1302
PHP $_SERVER包括的变量都为全局变量了可以叫超级全局变量,下面我来给大家整理了常用的PHP $_SERVER用法详细,希望对大家有所帮助。


我常用的$_SERVER[]变量

$_SERVER['HTTP_ACCEPT_LANGUAGE']//浏览器语言  

$_SERVER['REMOTE_ADDR'] //当前用户 IP 。  

$_SERVER['REMOTE_HOST'] //当前用户主机名  

$_SERVER['REQUEST_URI'] //URL 

$_SERVER['REMOTE_PORT'] //端口。  

$_SERVER['SERVER_NAME'] //服务器主机的名称。  

$_SERVER['PHP_SELF']//正在执行脚本的文件名  

$_SERVER['argv'] //传递给该脚本的参数。  

$_SERVER['argc'] //传递给程序的命令行参数的个数。  

$_SERVER['GATEWAY_INTERFACE']//CGI 规范的版本。  

$_SERVER['SERVER_SOFTWARE'] //服务器标识的字串  

$_SERVER['SERVER_PROTOCOL'] //请求页面时通信协议的名称和版本  

$_SERVER['REQUEST_METHOD']//访问页面时的请求方法  

$_SERVER['QUERY_STRING'] //查询(query)的字符串。  

$_SERVER['DOCUMENT_ROOT'] //当前运行脚本所在的文档根目录  

$_SERVER['HTTP_ACCEPT'] //当前请求的 Accept: 头部的内容。  

$_SERVER['HTTP_ACCEPT_CHARSET'] //当前请求的 Accept-Charset: 头部的内容。  

$_SERVER['HTTP_ACCEPT_ENCODING'] //当前请求的 Accept-Encoding: 头部的内容  

$_SERVER['HTTP_CONNECTION'] //当前请求的 Connection: 头部的内容。例如:“Keep-Alive”。  

$_SERVER['HTTP_HOST'] //当前请求的 Host: 头部的内容。  

$_SERVER['HTTP_REFERER'] //链接到当前页面的前一页面的 URL 地址。  

$_SERVER['HTTP_USER_AGENT'] //当前请求的 User_Agent: 头部的内容。  

$_SERVER['HTTPS']//如果通过https访问,则被设为一个非空的值(on),否则返回off  

$_SERVER['SCRIPT_FILENAME'] #当前执行脚本的绝对路径名。  

$_SERVER['SERVER_ADMIN'] #管理员信息  

$_SERVER['SERVER_PORT'] #服务器所使用的端口  

$_SERVER['SERVER_SIGNATURE'] #包含服务器版本和虚拟主机名的字符串。  

$_SERVER['PATH_TRANSLATED'] #当前脚本所在文件系统(不是文档根目录)的基本路径。  

$_SERVER['SCRIPT_NAME'] #包含当前脚本的路径。这在页面需要指向自己时非常有用。  

$_SERVER['PHP_AUTH_USER'] #当 PHP 运行在 Apache 模块方式下,并且正在使用 HTTP 认证功能,这个变量便是用户输入的用户名。  

$_SERVER['PHP_AUTH_PW'] #当 PHP 运行在 Apache 模块方式下,并且正在使用 HTTP 认证功能,这个变量便是用户输入的密码。  

$_SERVER['AUTH_TYPE'] #当 PHP 运行在 Apache 模块方式下,并且正在使用 HTTP 认证功能,这个变量便是认证的类型 


页面程序相关

•$_SERVER['PHP_SELF']:相对于网站根目录的路径及 PHP 程序名称,与 document root 相关。
•$_SERVER['HTTP_REFERER']:链接到当前页面的前一页面的 URL 地址。
•$_SERVER['SCRIPT_NAME']:相对于网站根目录的路径及 PHP 程序文件名称 。
•$_SERVER['REQUEST_URI']:访问此页面所需的 URI 。
•$_SERVER['SCRIPT_FILENAME']:当前运行 PHP 程序的绝对路径及文件名。
•$_SERVER['PATH_TRANSLATED']:当前 PHP 程序所在文件系统(不是文档根目录)的基本路径。
•$_SERVER['QUERY_STRING']:查询(query)的字符串(URL 中第一个问号 ? 之后的内容但不包括 # 后面的内容)。
•$_SERVER['argv']:传递给当前 PHP 程序的参数。
•$_SERVER['argc']:命令行模式下,包含传递给程序的命令行参数的个数。
•$_SERVER['REQUEST_TIME']:请求开始时的时间戳,从 PHP 5.1.0 起有效。
•$_SERVER['REQUEST_METHOD']:访问页面时的请求方法,例如:“GET”、“HEAD”,“POST”或“PUT”。
•$_SERVER['HTTP_ACCEPT']:当前请求的 Accept: 头信息的内容。
•$_SERVER['HTTP_ACCEPT_CHARSET']:当前请求的 Accept-Charset: 头信息的内容。例如:“iso-8859-1,*,utf-8”。
•$_SERVER['HTTP_ACCEPT_ENCODING']:当前请求的 Accept-Encoding: 头信息的内容。例如:“gzip”。
•$_SERVER['HTTP_ACCEPT_LANGUAGE']:当前请求的 Accept-Language: 头信息的内容。例如:“zh-cn”。
•$_SERVER['HTTP_CONNECTION']:当前请求的 Connection: 头信息的内容。例如:“Keep-Alive”。
•$_SERVER['HTTP_HOST']:当前请求的 Host: 头信息的内容。
•$_SERVER['HTTPS']:如果 PHP 程序是通过 HTTPS 协议被访问,则被设为一个非空的值。
•$_SERVER['PHP_AUTH_DIGEST']:当作为 Apache 模块运行时,进行 HTTP Digest 认证的过程中,此变量被设置成客户端发送的“Authorization”HTTP 头内容(以便作进一步的认证操作)。
•$_SERVER['PHP_AUTH_USER']:当 PHP 运行在 Apache 或 IIS(PHP 5 是 ISAPI)模块方式下,并且正在使用 HTTP 认证功能,这个变量便是用户输入的用户名。
•$_SERVER['PHP_AUTH_PW']:当 PHP 运行在 Apache 或 IIS(PHP 5 是 ISAPI)模块方式下,并且正在使用 HTTP 认证功能,这个变量便是用户输入的密码。
•$_SERVER['AUTH_TYPE']:当 PHP 运行在 Apache 模块方式下,并且正在使用 HTTP 认证功能,这个变量便是认证的类型。

服务器端相关

•$_SERVER['DOCUMENT_ROOT']:当前运行 PHP 程序所在的文档根目录,在服务器配置文件中定义。
•$_SERVER['GATEWAY_INTERFACE']:服务器使用的 CGI 规范的版本,例如:“CGI/1.1”。
•$_SERVER['SERVER_ADDR']:当前运行 PHP 程序所在的服务器的 IP 地址。
•$_SERVER['SERVER_NAME']:当前运行 PHP 程序所在的服务器的名称。
•$_SERVER['SERVER_ADMIN']:Apache 服务器配置文件中的 SERVER_ADMIN 参数。
•$_SERVER['SERVER_PORT']:服务器所使用的端口。如果使用 SSL 安全连接,则这个值为用户设置的 HTTP 端口。

•$_SERVER['SERVER_SIGNATURE']:包含服务器版本和虚拟主机名的字符串。
•$_SERVER['SERVER_SOFTWARE']:服务器标识的字串,在响应请求时的头信息中给出。
•$_SERVER['SERVER_PROTOCOL']:请求页面时通信协议的名称和版本,例如:“HTTP/1.0”。

其他杂项

•$_SERVER['HTTP_USER_AGENT']:当前请求的 User-Agent: 头信息的内容,该字符串表明了访问该页面的用户代理的信息。
•$_SERVER['REMOTE_ADDR']:正在浏览当前页面用户的 IP 地址。
•$_SERVER['REMOTE_HOST']:正在浏览当前页面用户的主机名。
•$_SERVER['REMOTE_PORT']:用户连接到服务器时所使用的端口。
注意,如果以命令行方式运行 PHP,上面列出的元素几乎没有有效的(或是没有任何实际意义的)。


例1

PHP获取当前url路径

1,$_SERVER["QUERY_STRING"]
说明:查询(query)的字符串
2,$_SERVER["REQUEST_URI"]
说明:访问此页面所需的URI

3,$_SERVER["SCRIPT_NAME"]
说明:包含当前脚本的路径

4,$_SERVER["PHP_SELF"]
说明:当前正在执行脚本的文件名

实例:
1,http://www.111cn.net/ (直接打开主页)
结果:
$_SERVER["QUERY_STRING"] = ""
$_SERVER["REQUEST_URI"] = "/"
$_SERVER["SCRIPT_NAME"] = "/index.php"
$_SERVER["PHP_SELF"]     = "/index.php"

2,http://www.111cn.net/?p=222 (附带查询)
结果:
$_SERVER["QUERY_STRING"] = "p=222"
$_SERVER["REQUEST_URI"] = "/?p=222"
$_SERVER["SCRIPT_NAME"] = "/index.php"
$_SERVER["PHP_SELF"]     = "/index.php"

3,http://www.111cn.net/index.php?p=222&q=biuuu
结果:
$_SERVER["QUERY_STRING"] = "p=222&q=biuuu"
$_SERVER["REQUEST_URI"] = "/index.php?p=222&q=biuuu"
$_SERVER["SCRIPT_NAME"] = "/index.php"
$_SERVER["PHP_SELF"]     = "/index.php"

$_SERVER["QUERY_STRING"]获取查询语句,实例中可知,获取的是?后面的值
$_SERVER["REQUEST_URI"] 获取http://www.111cn.net后面的值,包括/
$_SERVER["SCRIPT_NAME"] 获取当前脚本的路径,如:index.php
$_SERVER["PHP_SELF"] 当前正在执行脚本的文件名


当前url:"http://".$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']


总结一下,对于QUERY_STRING,REQUEST_URI,SCRIPT_NAME和PHP_SELF,深入了解将有利于我们在$_SERVER函数中正确调用这四个值。通过实例详解$_SERVER函数中QUERY_STRING,REQUEST_URI,SCRIPT_NAME和PHP_SELF掌握四个变量之间的区别。

session是php中一个很常用的全局变量了,下面我来给初学者来介绍关于php session一些用法总结,希望些方法对各位初学php朋友会有帮助哦,下面大家一起来看看吧。

PHP服务端默认的session存储是文件存放方式,在Windows上PHP默认的Session服务端文件存放在C:/WINDOWS/Temp下,*NIX下默认存放在/tmp下,如果说并发访问很大或者session建立太多,在这两个目录下就会存在大量类似sess_xxxxxx的session文件,同一个目录下文件数过多会导致性能下降,并且可能导致受到攻击最终出现文件系统错误。针对这样的情况,PHP本身体提供了比较好的解决办法。
不少朋友可能都没有注意到php.ini里面Session设置部分中有这样一项:
; session.save_path = "N; MODE; /path"

这项设置提供给我们可以给session存放目录进行多级散列,其中“N”表示要设置的目录级数,“MODE”表示目录的权限属性,默认为600,在WINDOWS上基本是不用设置的,*NIX上也可以不用设置,后面的“/path”表示session文件存放的根目录路径,比如我们设置为下面的格式

session.save_path = "2; /tmp/phpsession"

上面的设置表示我们把/tmp/phpsession目录作为php的session文件存放根目录,在该目录下进行两级目录散列,每一级目录分别是0-9和a-z共36个字母数字为目录名,这样存放session的目录可以达到36*36个,相信作为单台服务器来说,这是完全够用了,如果说您的系统架构设计为多台服务器共享session数据,可以把目录级增加到3级或者更多。

需要注意的是,php自己并不会自动创建子目录,需要您自己动手去创建,以下自动创建目录的代码,大家可以做个参考。下面的代码自动创建3级子目录,可以自己动手根据需要进行修改。

 代码如下 复制代码
<?php
set_time_limit(0);
 
$string = '0123456789abcdefghijklmnopqrstuvwxyz';
 
$length = strlen($string);
 
function makeDir($param)
 
{
 
if(!file_exists($param)) {
 
makeDir(dirname($param));
 
mkdir($param);
 
}
 
}
 
for($i = 0; $i < $length; $i++) {
 
for($j = 0; $j < $length; $j++) {
 
for($k = 0; $k < $length; $k++) {
 
makeDir($string[$i].'/'.$string[$j].'/'.$string[$k]);
 
}
 
}
 
}
 
?>

下面提供两种更好的解决方案:
1.session入库

利用session_set_save_handler函数

作用:自定义SESSION 存储机制。

可用于修改session存储介质,如进行session入库等操作。

实例代码

 代码如下 复制代码
class sessionsTable extends db{
    protected $table_name = 'sessions';
    public function __construct(){
        parent::__construct();
        session_set_save_handler(
        array($this,'sess_open'),
        array($this,'sess_close'),
        array($this,'sess_read'),
        array($this,'sess_write'),
        array($this,'sess_destroy'),
        array($this,'sess_gc')
        );
        session_start();
    }
    public function sess_open($save_path,$session_name){
        return true;
 
    }
    public function sess_close(){
        return true;
    }
 
 
    public function sess_read($sess_id){
        $sql = "select * from {$this->getTable()} where sess_id='{$sess_id}'";
        $row = $this->getRow($sql);
        return $row['sess_data'];
    }
    public function sess_write($sess_id,$sess_data){
 
        $expire = time();
        $sql = "insert into {$this->getTable()} values('{$sess_id}','{$sess_data}','{$expire}') on duplicate key
        update sess_data='{$sess_data}',expire='{$expire}'";
        return $this->query($sql);
    }
 
    public function sess_destroy($sess_id){
 
        $sql = "delete from {$this->getTable()} where sess_id='{$sess_id}'";
 
        return $this->query($sql);
 
    }
    public function sess_gc($life_time){
        $expire = time() - $life_time;
        $sql = "delete from {$this->getTable()} where expire < {$expire} ";
        return $this->query($sql);
    }
 
 
 
}

2.用memcache来存储session


方法I: 在 php.ini 中全局设置
session.save_handler = memcache
session.save_path = "tcp://127.0.0.1:11211"

方法II:在某个一个应用中利用ini_set设置
ini_set("session.save_handler", "memcache");
ini_set("session.save_path", "tcp://127.0.0.1:11211");

使用多个 memcached server 时用逗号","隔开,并且和 Memcache::addServer() 文档中说明的一样,可以带额外的参数"persistent"、"weight"、"timeout"、"retry_interval" 等等,类似这样的:"tcp://host1:port1?persistent=1&weight=2,tcp://host2:port2" 。

1.在php中如何操作session:

session_start();   //使用该函数打开session功能

$_SESSION       //使用预定义全局变量操作数据

使用unset($_SESSION['key']) //销毁一个session的值

简单地操作,一切都是由服务器实现;由于处理在后台,一切看起来也很安全。但是session采用什么样机制,又是怎样被实现,并且如何来保持会话的状态的呢?

 

2.session实现与工作原理

浏览器和服务器采用http无状态的通讯,为了保持客户端的状态,使用session来达到这个目的。然而服务端是怎么样标示不同的客户端或用户呢?
这里我们可以使用生活中的一个例子,假如你参加一个晚会,认识了很多人,你会采取什么方式来区分不同的人呢!你可能根据脸型,也有可能根据用户的名字,
或者人的身份证,即采用一个独一无二的标示。在session机制中,也采用了这样的一个唯一的session_id来标示不同的用户,不同的是:浏览器每次请求都会带上
由服务器为它生成的session_id.

简单介绍一下流程:当客户端访问服务器时,服务器根据需求设置session,将会话信息保存在服务器上,同时将标示session的session_id传递给客户端浏览器,
浏览器将这个session_id保存在内存中(还有其他的存储方式,例如写在url中),我们称之为无过期时间的cookie。浏览器关闭后,这个cookie就清掉了,它不会存在用户的cookie临时文件。
以后浏览器每次请求都会额外加上这个参数值,再服务器根据这个session_id,就能取得客户端的数据状态。

如果客户端浏览器意外关闭,服务器保存的session数据不是立即释放,此时数据还会存在,只要我们知道那个session_id,就可以继续通过请求获得此session的信息;但是这个时候后台的session还存在,但是session的保存有一个过期
时间,一旦超过规定时间没有客户端请求时,他就会清除这个session。

下面介绍一下session的存储机制,默认的session是保存在files中,即以文件的方式保存session数据。在php中主要根据php.ini的配置session.save_handler
 来选择保存session的方式。

这里顺便说明一下,如果要做服务器的lvs,即多台server的话,我们一般使用memcached的方式session,否则会导致一些请求找不到session。
一个简单的memcache配置:
session.save_handler = memcache
session.save_path = "tcp://10.28.41.84:10001"

当然如果一定要使用files文件缓存,我们可以将文件作nfs,将所有的保存session文件定位到一个地方。

刚才讲返回给用户的session-id最终保存在内存中,这里我们也可以设置参数将其保存在用户的url中。

ThinkPHP官方的说明文档

01.start 启动session

02.pause 暂停session
03.clear 清除session
04.destroy 销毁session
05.get 获取session值
06.getLocal 获取私有session值
07.set 设置session值
08.setLocal 设置私有session值
09.name 获取或者设置session_name
10.is_set 是否设置session值
11.is_setLocal 是否设置私有session值
12.id 获取或者设置session_id
13.path 获取或者设置session_save_path
14.setExpire 设置session过期时 间
15.setCookieDomain 设置有效域名
16.setCallback 设置Session 对象反序列化时候的回调函数
最常用的操作方法示例:

代码: 01.// 检测Session变量是否存在

 代码如下 复制代码

02.Session::is_set('name');

03.
// 给Session变 量赋值
04.
Session::set('name','value');
05.
// 获取Session变量
06.
Session::get('name');

和Session相关的配置参数:

代码:

 代码如下 复制代码

01.'SESSION_NAME'=>'ThinkID',                // 默认Session_name

02.       
'SESSION_PATH'=>'',                        // 采用默认的Session save path
03.       
'SESSION_TYPE'=>'File',                        // 默认Session类型 支持 DB 和 File 
04.       
'SESSION_EXPIRE'=>'300000',                // 默认Session有效期
05.       
'SESSION_TABLE'=>'think_session',        // 数据库Session方式表名
06.       
'SESSION_CALLBACK'=>'',                        // 反序列化对象的回调方法

其中SESSION_NAME 参数需要注意,如果需要在不同的项目之间不共享传递Session的值,请设置不同的值,否则请保留相同的默认值。
如 果设置了相同的SESSION_NAME的值,但是又希望创建基于项目的私有Session空间,应该怎么处理呢?ThinkPHP还支持以项目为 Session空间的私有Session操作,以之前的常用操作为例,我们更改如下:

代码:

 代码如下 复制代码

01.// 检测Session变量是否存在(当前项目有效)
02.Session::is_setLocal('name');

03.
// 给Session变 量赋值(当前项目有效)
04.
Session::setLocal('name','value');
05.
// 获取Session变量(当前 项目有效)
06.
Session::getLocal('name');

这样,和全局的Session操作就不会冲突,可以用于一些特殊情况的需要。

ThinkPHP支持数据库方式的Session操 作,设置SESSION_TYPE的值为DB就可以了,如果使用数据库方式,还要确保设置好SESSION_TABLE的值,并且导入下面的DDL到你的 数据库(以MySQL为例子):

代码:

 代码如下 复制代码

01.CREATE TABLE `think_session` (

02.  `
id` int(11) unsigned NOT NULL auto_increment,
03.  `
session_id` varchar(255) NOT NULL,
04.  `
session_expires` int(11) NOT NULL,
05.  `
session_data` blob,
06. 
PRIMARY KEY  (`id`)        
07.)

注意,Db Session方式的数据库连接会采用项目的数据库配置信息进行连接。除了数据库方式外,还可以增加其它方式的Session保存机制,例如内存方式、 Memcache方式等,我们只要增加相应的过滤器就行了,使用session_set_save_handler 方法,具体的方法定义参考Think.Util.Filter下面的FilterSessionDb.class.php 文件的实现。

 制作了一个简单的登陆判断

登陆检测之后赋予Session值,使Session的值为非空即为假的false

 代码如下 复制代码
$_SESSION[C('USER_AUTH_KEY')] = $logInFind['id'] ;

其中 [C('USER_AUTH_KEY')]为ThinkPHP的内置方法和函数类。在未配置config.php文件时默认为空
把$logInFind['id'] 取出的帐号值赋予它,默认为关闭页面Session就自动删除消失!

其它页面使用下面格式判断

 代码如下 复制代码
if(!isset($_SESSION[C('USER_AUTH_KEY')])) {  //isset 是检测变量是否赋值!
     $this->redirect('Login','Login'); //转到注册页面
    }
在学习开发时我们有必要知道了些常识,如变量命名规则是一个很重要的习惯了,如果你养成好的变量命名习惯以后和你合作的团队就会更容易接受你。

1.类命名

(1)使用camel命名法(这个几乎所有语言通用)

(2)尽量少于3个词

(3)缩写词也不要全部使用大写字母。eg:使用GetHtmlStatic, 而不使用GetHTMLStatic。

 2.函数和方法命名

通常每个方法和函数都执行一个动作,所以对它们的命名应该清楚地说明它们的用途。

eg:用CheckForErrors()代替ErrorCheck(),用DumpDataToFile代替DataFile().

 3.类属性命名

属性命名应该以字符"m" 为前缀。前缀”m“后采用于类命名一致的规则。

eg: var mVar;

 4.变量命名

使得所有的变量在代码中看起来都不同,容易辨认。

局部变量命名:所有字母都使用小写,使用 ”_“ 作为每个词的分界

eg:$time_of_error

全局变量命名:带前缀 "g"

eg: global $gLog;

静态变量命名:带前缀 "s"

eg: static $msStatics = 0;

引用变量命名:带前缀 ”r“

eg: var mrStatus;


string,字符串型,在变量前面加str

 代码如下 复制代码

//下面一个变量为字串型

 $strMessage = Hello World! ;
array,数组型, 在变量前面加a, 一维数组使用名词单数,多维数组使用词复数

//下面一个变量为一维数组
$aData = array ( 1 , 2 , 3 , 4 , 5 ,6) ;
//下面一个变量为多维数组
$aMembers = array ( id => 123456 , username => ABC , emai
l => abc#abc.com ) ;
integer,整数型变量,在前面加上n

 //下面一个变量为整数
$nCount = $pBS->Member->getCount() ;
boolean,布尔型在前面加上b


 //下面一个变量为布尔型
$bEncode = true ;
float,浮点型, 在前面加上f


 //下面一个变量为浮点型
$fSave = 0.8 ; // 8折
指针类型,比如类。在前面加上p


 //下面是一个类的实例化
$pBP = new BluePage ;
resource,资源型,在前面加上rs

$rsConn = mysql_connect ( localhost , user , pw ) ;
$rsHandle = fopen( $strFilename );

未明变量,使用mx

 

 代码如下 复制代码

$mxData = getData() ;

自定义函数,使用fn_开头

 代码如下 复制代码
function fn_HaltError ( $strErrorMessage )
{
    // do sth...
}

一个综合的例子(使用分页类):

 代码如下 复制代码

include ( "lib/BluePage.class.php" ) ;
$pBP = new BluePage ;

$rsConn = mysql_connect( localhost , root , 123456 ) or d
ie( mysql_error() ) ;
mysql_select_db( test , $rsConn );

$strQuery = "SELECT COUNT(`id`) FROM test" ;
$nCount = $pBP->myGetCount( $strQuery , $rsConn ) ; //取得总数
if ( $nCount < 1 )
{
    fn_HaltError( $aMessages[nodata] ) ;
}
$nShowNum  = 10 ;

//分页数组与html
$aPDatas   = $pBP->get( $nCount , $nShowNum ) ;
$strHtml   = $pBP->getHTML( $aPDatas ) ;

// 分页数据里包含有offset,取数据
$strQuery  = "SELECT * FROM test LIMIT " . $aPDatas[offse
t] . ", " . $nShowNum ;
$rsResult  = mysql_query( $strQuery );

在php中我们有时自己会写简单的网站页面访问统计器了,下面小编来给大家介绍利用PHP实现计数器代码,希望此方法对大家有帮助。

让我们在首页上加上一个计数器。有利于演示怎样读写文件以及创建自己的函数。counter.inc包含以下代码:

 代码如下 复制代码

<?
/*
|| 一个简单的计数器
*/
function get_hitcount($counter_file)
{
/* 将计数器归零
这样如果计数器还未被使用,初始值将是1
你当然也可以把初始值设成20000来骗人咯
*/
$count=0;
// 如果存放计数器文件已经存在,读取其中的内容
if ( file_exists($counter_file) )
{
$fp=fopen($counter_file,"r");
// 我们只取了前20位,希望你的站点不要太受欢迎啊
$count=0 fgets($fp,20);
// 由于函数fgets()返回字符串,我们可以通过加0的方法将其自动转换为整数
fclose($fp);
// 对文件操作完毕
}
// 增加一次计数值
$count ;
// 将新的计数值写入文件
$fp=fopen($counter_file,"w");
fputs($fp,$count);
fclose($fp);
# 返回计数值
return ($count);
}
?>

然后我们更改front.php3文件以显示这个计数器:

<?
include("include/counter.inc");
// 我把计数值放在文件counter.txt中,读出并输出
printf ("<CENTER><B>d</B></CENTER> <BR> n",
get_hitcount("counter.txt"));
include("include/footer.inc");
?>

例2

 代码如下 复制代码

1)文本计数器
<?php
$countfile="/count.txt";  //设置保存数据的文件
if (!file_exists($countfile)){//判断文件是否存在
exec( "echo 0 > $countfile");
}
$fp = fopen($countfile,"rw");
$length=filesize($countfile);
$num = fgets($fp,$length);
$num += 1;
exec( "rm -rf $countfile");
exec( "echo $num > $countfile");
PRint "访问量总计:"."$num"."人次";  //显示访问次数
?>
2)图形计数器
<?
$countfile="/count-num.txt";  //设置保存数据的文件
if (!file_exists($countfile))  //判断文件是否存在
{exec( "echo 0 > $countfile");}
$fp = fopen($countfile,"rw");
$length=filesize($countfile);
$num = fgets($fp,$length);
$num += 1;
exec( "rm -rf $countfile");
exec( "echo $num > $countfile");
$len_str = strlen($num);
for($i=0;$i<$len_str;$i++){
$each_num = substr($num,$i,1);
$out_str = $out_str . "<img src="$each_num.gif">";
}
print "访问量总计:"."$out_str"."人次";  //显示访问次数

本文章晋级人各位同学介绍关于PHP $this变量一些理解,希望些文章对各位同学会有所帮助。


手册上的一个有意思的小示例。
http://www.php.net/manual/zh/language.variables.basics.php

 代码如下 复制代码

 $this = 'text'; // error
 $name = 'this';
 $$name = 'text'; // sets $this to 'text'

 echo $$name;

在PHP的词法分析时,$this变量是符合其规则的,在语法解析生成中间代码时,PHP内核会根据变量类型在生成赋值的中间代码时判断是否为$this变量,如果是则报错。这里为什么要报错呢?因为this作为一个特殊的变量,在对象的成员方法等调用初始化时会将this变量添加到活动符号表。

在类的成员方法里面,可以用 ->(对象运算符):$this->property(其中 property 是该属性名)这种方式来访问非静态属性。

当一个方法在类定义内部被调用时,有一个可用的伪变量 $this。$this 是一个到主叫对象的引用(通常是该方法所从属的对象,但如果是从第二个对象静态调用时也可能是另一个对象)。

在词法分析、语法分析并生成中间代码时,$this作为一个特殊的变量存在,特别是在生成中间代码时,代码中充斥着对于this的特殊处理。这些都是为后面的运行做准备,如识别标记出某处使用this变量,在存储opcode的zend_op_array结构体中专门有一个变量this_var标识是否有this变量。一个函数或一个类方法都会生成一个新的zend_op_array,在生成中间代码时,判断当前变量是否为this变量。

this变量在执行过程中会有两种存在状态,一种是全局传递的状态,存储在EG(This),一种是当前作用域状态,以this变量存储在EG(active_symbol_table)(当前执行环境的活动符号表)。
在我们执行一个 op_array 时,比如一个对象的方法,PHP内核会给这个 op_array 生成一个 zendexecutedata ,在生成初始化时,EG(This) 会添加到EG(active_symbol_table) 。
在方法调用过程中,如果有用到this变量,则会直接取EG(active_symbol_table)的值。

那么一个对象中的EG(This)在哪里初始化呢?
就EG(This)变量本身来说,在我们初始化PHP的执行环境时,它和其它全局变量(如EG(scope)等)一样都会被初始化为NULL。
对于一个对象来说,当我们创建了一个对象,调用时,PHP内核会将当前获得的对象直接赋值给EG(This),而这个当前获得的对象是在通过new操作生成对象时创建的对象本身。

如下这个简单示例:

 代码如下 复制代码
 class Foo {
      public $var = 10;
 
      function t() {
           echo $this->var;    
      }
 
      function t2() {
       echo 33;
  }
 }
 
 $foo = new Foo();
 $foo->t();

其主程序流程生成的中间代码如下:

 代码如下 复制代码
        function name:  (null)
 number of ops:  8
 compiled vars:  !0 = $foo
 line     # *  op                           fetch          ext  return  operands
 ---------------------------------------------------------------------------------
    2     0  >   NOP                                                     
   15     1      ZEND_FETCH_CLASS                              4  :1      'Foo'
          2      NEW                                              $2      :1
          3      DO_FCALL_BY_NAME                              0         
          4      ASSIGN                                                   !0, $2
   16     5      ZEND_INIT_METHOD_CALL                                    !0, 't'
          6      DO_FCALL_BY_NAME                              0         
          7    > RETURN   
                                               1this

变量原始的对象值出生在 opcode NEW,经过了赋值(ASSIGN)后,在方法初始化时,将变量本身传递给执行环境的调用者,调用者又在执行调用(DO_FCALL_BY_NAME)时将变量传递给EG(This),当执行这个方法的op_array时,初始化当前作用域的环境(zend_execute_data)时,会将EG(This)作为$this变量添加到活动符号表,后续方法中的$this变量的使用就会直接取符号表的变量。

[!--infotagslink--]

相关文章

  • PHP成员变量获取对比(类成员变量)

    下面本文章来给大家介绍在php中成员变量的一些对比了,文章举了四个例子在这例子中分别对不同成员变量进行测试与获取操作,下面一起来看看。 有如下4个代码示例,你认...2016-11-25
  • php 中file_get_contents超时问题的解决方法

    file_get_contents超时我知道最多的原因就是你机器访问远程机器过慢,导致php脚本超时了,但也有其它很多原因,下面我来总结file_get_contents超时问题的解决方法总结。...2016-11-25
  • 图解PHP使用Zend Guard 6.0加密方法教程

    有时为了网站安全和版权问题,会对自己写的php源码进行加密,在php加密技术上最常用的是zend公司的zend guard 加密软件,现在我们来图文讲解一下。 下面就简单说说如何...2016-11-25
  • php抓取网站图片并保存的实现方法

    php如何实现抓取网页图片,相较于手动的粘贴复制,使用小程序要方便快捷多了,喜欢编程的人总会喜欢制作一些简单有用的小软件,最近就参考了网上一个php抓取图片代码,封装了一个php远程抓取图片的类,测试了一下,效果还不错分享...2015-10-30
  • HTTP 408错误是什么 HTTP 408错误解决方法

    相信很多站长都遇到过这样一个问题,访问页面时出现408错误,下面一聚教程网将为大家介绍408错误出现的原因以及408错误的解决办法。 HTTP 408错误出现原因: HTT...2017-01-22
  • C#变量命名规则小结

    本文主要介绍了C#变量命名规则小结,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-09
  • Android子控件超出父控件的范围显示出来方法

    下面我们来看一篇关于Android子控件超出父控件的范围显示出来方法,希望这篇文章能够帮助到各位朋友,有碰到此问题的朋友可以进来看看哦。 <RelativeLayout xmlns:an...2016-10-02
  • R语言 如何删除指定变量或对象

    这篇文章主要介绍了R语言删除指定变量或对象的操作方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-05-06
  • ps怎么使用HSL面板

    ps软件是现在很多人都会使用到的,HSL面板在ps软件中又有着非常独特的作用。这次文章就给大家介绍下ps怎么使用HSL面板,还不知道使用方法的下面一起来看看。 &#8195;...2017-07-06
  • ps把文字背景变透明的操作方法

    ps软件是现在非常受大家喜欢的一款软件,有着非常不错的使用功能。这次文章就给大家介绍下ps把文字背景变透明的操作方法,喜欢的一起来看看。 1、使用Photoshop软件...2017-07-06
  • Mysql select语句设置默认值的方法

    1.在没有设置默认值的情况下: 复制代码 代码如下:SELECT userinfo.id, user_name, role, adm_regionid, region_name , create_timeFROM userinfoLEFT JOIN region ON userinfo.adm_regionid = region.id 结果:...2014-05-31
  • intellij idea快速查看当前类中的所有方法(推荐)

    这篇文章主要介绍了intellij idea快速查看当前类中的所有方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-09-02
  • js导出table数据到excel即导出为EXCEL文档的方法

    复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta ht...2013-10-13
  • mysql 批量更新与批量更新多条记录的不同值实现方法

    批量更新mysql更新语句很简单,更新一条数据的某个字段,一般这样写:复制代码 代码如下:UPDATE mytable SET myfield = 'value' WHERE other_field = 'other_value';如果更新同一字段为同一个值,mysql也很简单,修改下where即...2013-10-04
  • Plesk控制面板新手使用手册总结

    许多的朋友对于Plesk控制面板应用不是非常的了解特别是英文版的Plesk控制面板,在这里小编整理了一些关于Plesk控制面板常用的使用方案整理,具体如下。 本文基于Linu...2016-10-10
  • ps怎么制作倒影 ps设计倒影的方法

    ps软件是一款非常不错的图片处理软件,有着非常不错的使用效果。这次文章要给大家介绍的是ps怎么制作倒影,一起来看看设计倒影的方法。 用ps怎么做倒影最终效果&#819...2017-07-06
  • js基础知识(公有方法、私有方法、特权方法)

    本文涉及的主题虽然很基础,在许多人看来属于小伎俩,但在JavaScript基础知识中属于一个综合性的话题。这里会涉及到对象属性的封装、原型、构造函数、闭包以及立即执行表达式等知识。公有方法 公有方法就是能被外部访问...2015-11-08
  • 安卓手机wifi打不开修复教程,安卓手机wifi打不开解决方法

    手机wifi打不开?让小编来告诉你如何解决。还不知道的朋友快来看看。 手机wifi是现在生活中最常用的手机功能,但是遇到手机wifi打不开的情况该怎么办呢?如果手机wifi...2016-12-21
  • 使用insertAfter()方法在现有元素后添加一个新元素

    复制代码 代码如下: //在现有元素后添加一个新元素 function insertAfter(newElement, targetElement){ var parent = targetElement.parentNode; if (parent.lastChild == targetElement){ parent.appendChild(newEl...2014-05-31
  • PHP 验证码不显示只有一个小红叉的解决方法

    最近想自学PHP ,做了个验证码,但不知道怎么搞的,总出现一个如下图的小红叉,但验证码就是显示不出来,原因如下 未修改之前,出现如下错误; (1)修改步骤如下,原因如下,原因是apache权限没开, (2)点击打开php.int., 搜索extension=ph...2013-10-04