全局变量和“global”关键字
PHP默认定义了一些“超级全局(Superglobals)”变量,这些变量自动全局化,而且能够在
程序的任何地方中调用,比如$_GET和$ _REQUEST等等。它们通常都来自数据或者其他外部数
据,使用这些变量通常是不会产生问题的,因为他们基本上是不可写的。
但是你可以使用你自己的全局变量。使用关键字“global”你就可以把全局数据导入到一个
函数的局部范围内。如果你不明白“变量使用范围”,请你自己参考PHP手册上的相关说明。
下面是一个使用“global”关键字的演示例子:
<?php教程
$my_var = 'Hello World';
test_global();
function test_global() {
// Now in local scope
// the $my_var variable doesn't exist
// Produces error: "Undefined variable: my_var"
echo $my_var;
// Now let's important the variable
global $my_var;
// Works:
echo $my_var;
}
?>
正如你在上面的例子中看到的一样,“global”关键字是用来导入全局变量的。看起来它工
作的很好,而且很简单,那么为什么我们还要担心使用“global”关键字来定义全局数据呢
我来给处入行的人讲解一下全局变量global的使用,”全局变量“,这个名词中的全局两个
字已经告诉我们这个变量在各个地方都能用,先看一个实例:
<?php
$a = 1;
$b = 2;function Sum()
{
global $a, $b; //在里面声明为全局变量$b = $a + $b;
}Sum();
echo $b;
?>
结果: 3
如果没有全局变量global在方法内是不能获得$a,$b值的,所以在方法里面想用外面的变量就
需要先声明这个变量为全局变量,这样就可以使用了,很方便吧。
<?PHP
$w3sky = 1;
$w3sky2 = 2;function Sum()
{
global $w3sky, $w3sky2;$w3sky2 = $w3sky + $w3sky2;
}Sum();
echo $w3sky2;
?>
以上脚本的输出将是“3”。在函数中申明了全局变量 $w3sky 和 $w3sky2,任何变量的所有
引用变量都会指向到全局变量。对于一个函数能够申明的全局变量的最大个数,PHP 没有限
制。
在全局范围内访问变量的第二个办法,是用特殊的 PHP 自定义 $GLOBALS 数组。前面的例子
可以写成:
例子 使用 $GLOBALS 替代 global
<?PHP
$w3sky = 1;
$w3sky2 = 2;function Sum()
{
$GLOBALS['w3sky'] = $GLOBALS['w3sky'] + $GLOBALS['w3sky2'];
}Sum();
echo $w3sky2;
?>
在 $GLOBALS 数组中,每一个变量为一个元素,键名对应变量名,值对应变量的内
容。$GLOBALS 之所以在全局范围内存在,是因为 $GLOBALS 是一个超全局变量。以下范例显
示了超全局变量的用处:
例子 演示超全局变量和作用域的例子
<?PHP
function test_global()
{
// 大多数的预定义变量并不 "super",它们需要用 'global' 关键字来使它们在函
数的本地区域中有效。
global $HTTP_POST_VARS;echo $HTTP_POST_VARS['name'];// Superglobals 在任何
范围内都有效,它们并不需要 'global' 声明。Superglobals 是在 PHP 4.1.0 引入的。
echo $_POST['name'];
}
?>global 也就是说在一个文件里 只要你声明为global $db 那么在声明的下面 你就
可以引用这个$db了
<?php
function SayMyABCs2()
{
global $count;
while($count<10)
{
print(chr(ord('A')+$count));
$count=$count+1;
}
print("<br>Now I know $count letters<br>");
}
$count=0;
SayMyABCs2();
$count=$count+1;
print("Now I've made $count function call(s).<br>");
SayMyABCs2();
$count=$count+1;
print("Now I've made $count function call(s).<br>");
?>
output:
ABCDEFGHIJ //第一次循环依次打印10个大写字母
Now I know 10 letters
Now I've made 11 function call(s). //第二次由于条件大于10则不执行循环Now I know 11 letters
Now I've made 12 function call(s).
由于global对变量的声明,现在只有一个$count变量,它在函数内和函数外都被增值了,当
第二次调用SayMyABCs2()时,$count已经是11了,因此根本不会进入打印字母的循环。在函
数内定义的变量的作用域默认情况下是局限于该函数的,使用global声明,就可以通知PHP,
现在需要让一个变量名和它在函数外环境中有同样的含义。声明格式:global
$count1,$count2,...,$countn;
global在另一方面又很有用,尤其是因为PHP提供了一些变量,可在其代码执行之前绑到每个
页面上,它能够让函数看到这些变量,而省去了每次在调用中把它们作为参数传入函数这一
麻烦
显示本月,上月,今天,今年以及各时间起点与终点的做法
mktime() 函数返回一个日期的 Unix 时间戳。
参数总是表示 GMT 日期,因此 is_dst 对结果没有影响。
参数可以从右到左依次空着,空着的参数会被设为相应的当前 GMT 值。
PHP Date() 函数
PHP Date() 函数可把时间戳格式化为可读性更好的日期和时间。
语法
date(format,timestamp)参数 描述
format 必需。规定时间戳的格式。
timestamp 可选。规定时间戳。默认是当前的日期和时间。
上面我们简单的讲了一下mktime与date函数,下面我们就来看看利用他们实例今天,上月,下月等日期计算
$t = time();
$t1 = mktime(0,0,0,date(“m”,$t),date(“d”,$t),date(“Y”,$t));
$t2 = mktime(0,0,0,date(“m”,$t),1,date(“Y”,$t));
$t3 = mktime(0,0,0,date(“m”,$t)-1,1,date(“Y”,$t));
$t4 = mktime(0,0,0,1,1,date(“Y”,$t));
$e1 = mktime(23,59,59,date(“m”,$t),date(“d”,$t),date(“Y”,$t));
$e2 = mktime(23,59,59,date(“m”,$t),date(“t”),date(“Y”,$t));
$e3 = mktime(23,59,59,date(“m”,$t)-1,date(“t”,$t3),date(“Y”,$t));
$e4 = mktime(23,59,59,12,31,date(“Y”,$t));
参考一下关于mktime()函数
参数 | 描述 |
---|---|
hour | 可选。规定小时。 |
minute | 可选。规定分钟。 |
second | 可选。规定秒。 |
month | 可选。规定用数字表示的月。 |
day | 可选。规定天。 |
year | 可选。规定年。在某些系统上,合法值介于 1901 - 2038 之间。不过在 PHP 5 中已经不存在这个限制了。 |
is_dst |
可选。如果时间在日光节约时间(DST)期间,则设置为1,否则设置为0,若未知,则设置为-1。 自 5.1.0 起,is_dst 参数被废弃。因此应该使用新的时区处理特性。 |
//测试
echo date(“当前 Y-m-d H:i:s”,$t).” $t<br>”;
echo date(“今天起点 Y-m-d H:i:s”,$t1).” $t1<br>”;
echo date(“今月起点 Y-m-d H:i:s”,$t2).” $t2<br>”;
echo date(“上月起点 Y-m-d H:i:s”,$t3).” $t3<br>”;
echo date(“今年起点 Y-m-d H:i:s”,$t4).” $t4<br>”;
//测试
echo date(“今天终点 Y-m-d H:i:s”,$e1).” $e1<br>”;
echo date(“今月终点 Y-m-d H:i:s”,$e2).” $e2<br>”;
echo date(“上月终点 Y-m-d H:i:s”,$e3).” $e3<br>”;
echo date(“今年终点 Y-m-d H:i:s”,$e4).” $e4<br>”;
结果:
当前 2011-05-24 15:42:55 1306222975
今天起点 2011-05-24 00:00:00 1306166400
今月起点 2011-05-01 00:00:00 1304179200
上月起点 2011-04-01 00:00:00 1301587200
今年起点 2011-01-01 00:00:00 1293811200
今天终点 2011-05-24 23:59:59 1306252799
今月终点 2011-05-31 23:59:59 1306857599
上月终点 2011-04-30 23:59:59 1304179199
今年终点 2011-12-31 23:59:59 1325347199
看一下date函数
参数 | 描述 |
---|---|
format | 必需。规定时间戳的格式。 |
timestamp | 可选。规定时间戳。默认是当前的日期和时间。 |
PHP 日期 - 格式化日期
date() 函数的第一个参数规定了如何格式化日期/时间。它使用字母来表示日期和时间的格式。这里列出了一些可用的字母:
d - 月中的天 (01-31)
m - 当前月,以数字计 (01-12)
Y - 当前的年(四位数)
您可以在我们的 PHP Date 参考手册中,找到格式参数中可以使用的所有字母。
正则表达式的写法规则:"/规则需要写在2个斜杠中间/"。
(. :小数点)用于匹配除换行符之外的所有字符。
(s:反斜杠小写s)用于匹配单个空格符,包括tab键和换行符;
(S:反斜杠大写S)用于匹配除单个空格符之外的所有字符;
(d:反斜杠d)用于匹配从0到9的数字;也可以这样写:[0-9]
(w:反斜杠小写w)用于匹配字母,数字或下划线字符;
(W:反斜杠大写W)用于匹配所有与w不匹配的字符;
元字符包括: +, *,?
元字符理解起来容易混淆,所以我在后面做了代码结果截图
复制代码 代码如下:
“+”元字符规定其前导字符必须连续出现一次或多次
= 比如/es+/
与“tesseessssseast12354haeasashaha”字符串相匹配,首先要与第一个字母e匹配,然后匹配s,s必须出现一次或多次,请看实例截图。
“*”元字符规定其前导字符必须出现零次或连续多次
= 比如/es*/
与“tesseessssseast12354haeasashaha”字符串相匹配,首先与第一个字母e匹配,后面的s出现零次或者连续出现,看实例。
“?”元字符规定其前导对象必须连续出现零次或一次
= 比如/es?/
与“tesseessssseast12354haeasashaha”字符串相匹配,首先与第一个字母e匹配,后面的s出现零次或者最多出现一次(就是最后一个字母s不重复出现)。
示例代码:
复制代码 代码如下:
$str = "tesseessssseast12354haeasashaha";
echo "=====".$str."
";
echo "/es+/:".preg_replace("/es+/","--",$str)."
";
echo "/es*/:".preg_replace("/es*/","--",$str)."
";
echo "/es?/:".preg_replace("/es?/","--",$str)."
";
?>
执行结果截图:
另外如果觉得元字符“+*?”比较难理解可以用这种{ }方法代替:
比如es*我们可以写成es{0,},而es+我们可以写成es{1,},es?可以写成es{0,1},注意:当不确定次数的时候就不用写(也不用空格)。
当然我们要指定出现多少次的可以写成这样:es{3}表示s出现3次
举一反三:
比如要替换连续多个空格为一个空格,我可以这样写:preg_replace("/s+/"," ",$str);
比如要找出字符串中的数字(整数):preg_replace("/d+/", "()", $str); 是表示符合规则的字符串值
比如要找出字符串中的带小数点的数字:preg_replace("/d+.d+/", "()", $str); //这里的“.”表示输出小数点
找出由字母组成的字符串:preg_replace("/[a-zA-Z]+/", "()", $str)
找出由(字母、数字混合)组成的字符串:preg_replace("/([a-zA-Z]|d)+/", "()", $str)
正则表达式中“或”运算,使用 “ | ”
例如上面的例子:找出由(字母或数字)混合组成的字符串([a-zA-Z]|d) 也可以这样写([a-zA-Z]|[0-9])
“^”出现在 “[ ]”内时就被视做否定运算符;[^0-9]表示除了数字之外的任何字符。
而当“^”位于“[ ]”之外,或没有“[ ]”时,则应当被视做定位符。
定位符的意思就是比如:“^The”:开头一定要有”The”字符串;类似的:“en$”:$符号表示必须是en结尾。
php教程用户注册过滤中文用户名,在很多开发中,用户名是不允许中文名字的,所以我们今天做个实例,限制中文名注册,在php中我们可以利用正则表达式来限制中文名如preg_match("/^[".chr(0xa1)."-".chr(0xff)."]+$/"了,下面看实例。
<?php
header("Content-type:text/html;charset=gb2312");
require_once('inc/connect.php');
$xm=isset($_GET['txt'])?$_GET['txt']:'null';
$ta=isset($_GET['tag'])?$_GET['tag']:3;if( $ta==1 ){
if(preg_match("/^[".chr(0xa1)."-".chr(0xff)."]+$/", $xm)){
echo("<div id='error'>对不起,不能使用中文作为用户名! </div>");
exit();
}
if($xm=='null' || $xm=='' || strlen($xm)>10 || strlen($xm)<3){
echo("<div id='error'>对不起,用户由3-12Aa_zZ及数字组成! </div>");
exit();
}else{
$result=mysql教程_query("select m_uid from wk_member where m_uid='$xm' ") or die('Error !'.mysql_error());
if(!mysql_num_rows($result)){
echo("<div id='success'><font color=red> 恭喜你!此用户可以注册!</font> </div>");
}else{
echo("<div id='error'>对不起,用户己被注册请选择其它名称!</div>");
}
}}elseif( $ta==0){
if(@file_get_contents($xm)){
echo '<div id="success"> 博客地址可以访问</div>';
}else{
echo '<div id="error">对不起,你输入的博客地址不能正常访问<div >';
}
}else{
echo "<div id='error'>对不起,无效的操作!</div>";
}
?>
总结:
方法很简单,只要获取用户输入的资料再利用preg_match判断一下就可以了。
cookie 常用于识别用户。cookie 是服务器留在用户计算机中的小文件。每当相同的计算机通过浏览器请求页面时,它同时会发送 cookie。通过 php教程,您能够创建并取回 cookie 的值。
如何创建 cookie?
setcookie() 函数用于设置 cookie。
注释:setcookie() 函数必须位于 <html> 标签之前。
语法
setcookie(name, value, expire, path, domain);
$content_id = array();//1.创建一个数组
$content_id[] = $_get['contentid']; //2.对接受到的id插入到数组中去if(isset($_cookie['content_id'])) //3.判定cookie是否存在,第一次不存在(如果存在的话)
{
$now_content = str_replace("", "", $_cookie['content_id']);//(4).您可以查看下cookie,此时如果unserialize的话出问题的,我把里面的斜杠去掉了
$now = unserialize($now_content); //(5).把cookie 中的serialize生成的字符串反实例化成数组
foreach($now as $n=>$w) { //(6).里面很多元素,所以我要foreach 出值
if(!in_array($w,$content_id)) //(7).判定这个值是否存在,如果存在的化我就不插入到数组里面去;
{
$content_id[] = $w; //(8).插入到数组
}
}
$content= serialize($content_id); //(9).把数组实例化成字符串
setcookie("content_id",$content, time()+3600*24); //(10).插入到cookie}else {
$content= serialize($content_id);//4.把数组实例化成字符串
setcookie("content_id",$content, time()+3600*24); //5.生成cookie
}$getcontent = unserialize(str_replace("", "", $_cookie['content_id']));
/*foreach($getcontent as $row=>$r)
{
echo $r;//(取值)
}*/