首页 > 编程技术 > php

PHP6 的namespace 命名空间

发布时间:2016-11-25 15:13

php有namespace或类似的东西的。对于发布类库框架,或者构建大的程序来说是很重要的。可以避免类名和函数名冲突,又不用像Pear里那样把类名弄得老长。当初php5的测试版曾经出现过,后来正式发布时又取消了,让我空欢喜一场。7月初,php6的snap里又加入了namespace,希望这次不要再让我空欢喜了。

  这次的namespace实现和当初的实现有所不同,更接近于C++的语法。

声明namespace时在文件里加上例如

namespace blogbus::test;

function foo(){
    echo "foo";
}

class Test{
    function bar(){
        echo "bar";
    }
}

  该文件中的类和函数:foo,Test就属于blogbus::test的命名空间。在其他文件包含该文件后,可以用blogbus::test::foo()来调用函数,用blogbus::test::Test来使用类。如果只是这样的话那打字还是很麻烦的。所以可以使用
import blogbus::test::Test;
之后就可以直接用Test了。也可以
import blogbus;
之后可以用test::Test来使用。可惜目前的实现没有类似Java的import xxx.*; 或是python的from xxx import *;这样的语法。要导入许多东西的时候还是有些麻烦。

   既然namespace是为了解决命名冲突的问题,那么使用import来节省打字,保护键盘的时候还是需要避免import进来的东西和原有的东西重名的问题。所以import还可以这样用:import blogbus::test::Test as Blogbus。这时,就可以用Blogbus这个名字来使用blogbus::test::Test。你可以$test = new Blogbus();然后echo get_class($test);看看结果,会发现输出的仍然是blogbus::test::Test。

正则其实也势利,削尖头来把钱揣; (指开始符号^和结尾符号$)2 L. @4 T# n) ~( B
特殊符号认不了,弄个倒杠来引路; (指. *等特殊符号)0 B4 w0 }( d2 m) i) o
倒杠后面跟小w, 数字字母来表示; (w跟数字字母;d跟数字)
1 V3 r& a+ B+ K. T  X; ?倒杠后面跟小d, 只有数字来表示;
% k, / D7 ]$ D9 e0 W- a倒杠后面跟小a, 报警符号嘀一声;! X) H6 B  K3 i" V% |' _
倒杠后面跟小b, 单词分界或退格;) p6 ^! u) o' ^  o
倒杠后面跟小t, 制表符号很明了;& H5 X( M+ _( K& y
倒杠后面跟小r, 回车符号知道了;) ]" ~4 _) }2 w; f
倒杠后面跟小s, 空格符号很重要;% D0 d+ r6 _( n4 ?4 M
小写跟罢跟大写,多得实在不得了;2 [" R5 }7 U1 {, m6 j" V. H4 a# i
倒杠后面跟大W, 字母数字靠边站;
1 u7 ~0 {1 |8 g7 `# P6 z倒杠后面跟大S, 空白也就靠边站;5 U' a( }- $ b9 M( d0 P# G
倒杠后面跟大D, 数字从此靠边站;
9 L6 [4 [( K5 A) V4 _倒框后面跟大B, 不含开头和结尾;% L2 S) ~; ]) s4 R/ h: G2 J

1 y' ?; c% @" J6 h单个字符要重复,三个符号来帮忙; (* + ?)$ a+ Q3 f8 G) B4 T; W# Q  `
0 星加1 到无穷,问号只管0 和1; (*表0-n;+表1-n;?表0-1次重复)' ]4 G2 L: ]" V
花括号里学问多,重复操作能力强; ({n} {n,} {n,m})8 y/ y; ]2 V( Q0 U9 O$ c
若要重复字符串,园括把它括起来; ((abc){3} 表示字符串“abc”重复3次 )
! q' j! |8 s' l9 i特殊集合自定义,中括号来帮你忙;& R5 D9 I+ g7 L: T6 ?
转义符号行不通,一个一个来排队;
% Z( ! |' y, Z2 E$ i# p3 S0 ~" - q实在多得排不下,横杠请来帮个忙; ([1-5])' X, d  y, o# N* e* P
尖头放进中括号,反义定义威力大; ([^a]指除“a”外的任意字符 )
6 U/ s: v; [6 |  i2 w9 o1竖作用可不小,两边正则互替换; (键盘上与“”是同一个键)
# J! `3 f. R* |3 K# f1竖能用很多次,复杂定义很方便;5 t+ b8 S' |3 l. @8 Y8 Z0 o
园括号,用途多;- Y* K  r! X8 W6 z+ C9 y1 U: g$ V$ f
反向引用指定组,数字排符对应它; (“b(w+)bs+1b”中的数字“1”引用前面的“(w+)”)( o5 p" @& u8 ]7 l
支持组名自定义,问号加上尖括号; (“(?<Word>w+)”中把“w+”定义为组,组名为“Word”)
3 j. P2 g: T5 V9 b园括号,用途多,位置指定全靠它;! L! Y6 w6 ; B* L+ w
问号等号字符串,定位字符串前面; (“bw+(?=ingb)”定位“ing”前面的字符串)
! B7 ~5 X1 c: r, y若要定位串后面,中间插个小于号; (“(?<=bsub)w+b”定位“sub”后面的字符串)
8 i2 f1 Y2 r, j9 m1 j问号加个惊叹号,后面跟串字符串;
1 M$ n% : d+ @9 1 o: YPHPer都知道, !是取反的意思;( E% c; J" X: C  Q: m& T" m
后面不跟这一串,统统符合来报到; (“w*d(?!og)w*”,“dog”不符合,“do”符合)
6 @9 t7 B7 F$ g( Z) }问号小于惊叹号,后面跟串字符串;
! ~; E- N' u5 O前面不放这一串,统统符合来报到;1 T  i/ ?' i3 m+ I2 x
点号星号很贪婪,加个问号不贪婪;# O+ M" ?: |' e. V/ T
加号问号有保底,至少重复一次多;
0 G9 e3 Y7 d! x9 g$ T& N两个问号老规矩,0次1次团团转;( @* q5 v' E8 |/ g
花括号后跟个?,贪婪变成不贪婪;

php数组操作实例教程
data 数组中的每个单元表示一个表中的一行。这是典型的数据库存放数组数据的方式。
例子中的数据如下:
volume | edition
-------+--------
67 | 2
86 | 1
85 | 6
98 | 2
86 | 6
67 | 7

数据全都存放在名为 data 的数组中。这通常是通过循环从数据库取得的结果,例如 mysql_fetch_assoc()(实际上这个函数你可以和mysql_fetch_assoc()函数看成一样,具体的差别你可以看PHP的手册里面关于key的差别)。
$data[] = array('volume' => 67, 'edition' => 2);
$data[] = array('volume' => 86, 'edition' => 1);
$data[] = array('volume' => 85, 'edition' => 6);
$data[] = array('volume' => 98, 'edition' => 2);
$data[] = array('volume' => 86, 'edition' => 6);
$data[] = array('volume' => 67, 'edition' => 7);

本例中将把 volume 降序排列,把 edition 升序排列。

现在有了包含有行的数组,但是 array_multisort() 需要一个包含列的数组,因此用以下代码来取得列,然后排序。
// 取得列的列表
foreach ($data as $key => $row) {
$volume[$key] = $row['volume'];
$edition[$key] = $row['edition'];
}

// 将数据根据 volume 降序排列,根据 edition 升序排列
// 把 $data 作为最后一个参数,以通用键排序
array_multisort($volume, SORT_DESC, $edition, SORT_ASC, $data);

数据集合现在排好序了,结果如下:
volume | edition
-------+--------
98 | 2
86 | 1
86 | 6
85 | 6
67 | 2
67 | 7

实际上真正在排序的时候还有很多方法可以使用,比如php的array数组自带的 arsort(),asort(),ksort(),krsort(),natsort(),natcasesort(),rsort(),usort(),array_multisort() 和 uksort()。

首先,我们用数组模拟一个参数传递。接收到的是一组ID,我在这里给它命名为 $nums:


$nums[] = 1;

$nums[] = 2;

$nums[] = 3;

$nums[] = 4;


然后,我们用 $data 数组摸拟一个数据表中存放的内容,有ID,用户名:


$data[0]['id'] = 1;

$data[0]['name'] = 'aaa';

$data[1]['id'] = 2;

$data[1]['name'] = 'bbb';

$data[2]['id']      = 3;

$data[2]['name']   = 'ccc';

$data[3]['id']      = 4;

$data[3]['name']   = 'ddd';


接下来,我们再用 $rs 数组摸拟另一个表中存放的内容,也是相对应的,有相同的ID,然后这个表中存放的是电话号码:


$rs[0]['id']       = 1;

$rs[0]['mobile']   = '1111111';

$rs[1]['id']       = 2;

$rs[1]['mobile']   = '2222222';

$rs[2]['id']       = 10;

$rs[2]['mobile']   = '3333333';

$rs[3]['id']       = 4;

$rs[3]['mobile']   = '4444444';

 

 

 

 

 


现在,我们要做的就是要从 $data 和 $rs 这两个数组中,读取出与ID相对应的用户名和电话号码,用列表显示出来:


echo '<table width=400 align=center border=1>';


foreach ($nums AS $k => $v) {


    // 模拟读取数据库中 $nums == $data['id'] 的数据, 获取用户名

    foreach ($data AS $kd => $vd) {

        if ($v == $vd['id']) {

            $names = $vd['name'];

        }

    }


    // 模拟读取数据库中 $nums == $rs['id'] 的数据, 获取手机号码

    foreach ($rs AS $kr => $vr) {

        if ($v == $vr['id']) {

            $mobile = $vr['mobile'];

        }

    }


    echo '<tr>

                <td>' . $v . ' </td>

                <td>' . $names . ' </td>

                <td>' . $mobile . ' </td>

            </tr>';

}


echo '</table>';

 

然后,写到这里后,我就运行这个页面了,可是,当我运行完了页面后,发现,出问题了:

 


如图所示,ID == 3 的用户的电话号码变成了ID == 2 ,的电话号码了。


为什么会这样呢。。让我们来检查一下我们的代码吧:


首先,$nums 数组中的“id”是1,2,3,4  没错,$data 数组中的“id”也是1,2,3,4  也没错,但是, $rs 数组中的“id“却有问题了,是 1,2,10,4。这里就没有3了。


所以读取不到电话号码。但是为什么在 id == 3 的那一列中,电话号码会显示出 id == 2的电话号码呢?我们接着往下看:


 // 模拟读取数据库中 $nums == $rs['id'] 的数据, 获取手机号码

    foreach ($rs AS $kr => $vr) {

        if ($v == $vr['id']) {

            $mobile = $vr['mobile'];

        }

    }


我们是在这里给 $mobile 赋的值,当  $nums 中的“id” 等于 $rs 中的 “id” 时,它就把 $rs 中的电话号码赋给 $mobile变量,当执行完 id == 2 以后,进行第三次循环时,我们发现,这里条件不符,所以直接跳过了。 但是,$mobile 的值仍然是 id == 2 的时候的值! 对。这就是问题所在了!


找到问题过后,小编我休息了下,喝了口凉水,然后在foreach语句结束之前把所有循环的变量全部给unset() 了,

php cookie setcookie使用实例

session和cookie功能.为了永久的保持用户信息,则cookie是最便捷的手段.在这里我将为大家详细的讲解cookie的功能及使用方法.

一: 设置cookie
使用cookie前必须设置cookie.
函数原型:int setcookie(string name,string value,int expire,string path,string domain,int secure)
其中,除name外,所有的参数都是可选的,可以用空的字符串表示未设置.
属性value: 用来指定值.
属性path: 用来指定cookie被发送到服务器的哪一个目录路径下.
属性domain:能够在浏览器端对cookie的发送进行限定.
expire参数:用来指定cookie的有效时间,它是一个标准的Unix时间标记.
可以用time()或者mktime()函数取得,以秒为单位.
secure参数:表示这个cookie是否通过加密的HTTPS协议在网络上传输.

二: 设置cookie时的注意事项
在同一个页面中设置cookie,实际上是按从后往前的顺序进行的.如果要先删除一个cookie,再写入一个cookie,则必须先写写入语句,再写删除语句.否则会出现错误.

三: setcookie举例
简单的: setcookie("mycookie","value_of_mycookie");
带失效时间的: setcookie("withExpire","Expire_in_1_hour",time()+3600);
什么都有的:setcookie("FullCookie","Full_cookie_value",time+3600,"/forum","www.123.com",1);

四: cookie的一些特点
cookie是面向路径的.缺省path属性时,WEB服务器页会自动传递当前路径给浏览器.指定路径会强制服务器使用设置的路径.
在一个目录页面里设的cookie在另一个目录的页面里是看不到的.

五: 接收和处理cookie
PHP对cookie的处理是全自动的,和处理FORM变量的原则一样.当然也可以使用PHP全局变量,$HTTP_COOKIE_VARS数组.
例: echo $mycookie;
echo $cookie Array[0];
echo count($cookie Array);
echo $HTTP_COOKIE_VARS["mycookie"];

六: 删除cookie
(1)调用只带有name参数的setcookie();
(2)使失效时间为time()或time-1;

七: 使用cookie的限制
(1) 必须在HTML文件的内容输出之前设置;
(2)不同的浏览器对cookie的处理不一致,使用时一定要考虑;
(3)客户端的限制,比如用户设置禁止cookie,则cookie不能建立;

八: 一个具体的例子,希望大家对cookie有更加深刻的认识
CODE:
[复制到剪切板]
<?
//cookie.php
if(!isset($flag))
{
setcookie("mycookie","this my cookie!");
header("location:cookie.php?flag=1");
exit;
}
?>
<html>
<body>
<?
echo "cookie中有:".$mycookie;
?>
</body>
</html>

标签:[!--infotagslink--]

您可能感兴趣的文章: