命名空间
命名变量,函数和类是挺困难的,除了要考虑到变量的名称要易于理解,还要担心是否这个名称在其它某个地方已经使用过. 在一小段脚本中,第二个问题是基本问题. 当你考虑重用你的代码, 在这之后的项目代码必须避免使用你用过的命名. 通常来说,可重用的代码总是包含在函数或类中, 需要处理许多可能发生的命名冲突. 但函数和类之间也可能发生命名冲突. 你可以尝试避免出现这种情况,通过在所有类前添加前缀的方法,或者你可以使用namespace语句.
Namespace要害字给一块代码命名. 在这个代码块外部,脚本必须用操作符::加上命名空间的名称来引用这个代码块. 引用静态的类成员也是用相同的方法. 在命名空间内代码不需要声明命名空间, 它本身就是默认的. 这种方法比添加前缀的方法好. 你的代码可由此变得更加紧凑和可读.
你可能想知道是否可以建立分层的(嵌套的)命名空间. 答案是不可以. 但你可以在命名空间名称后加上冒号, 你可以再次调用在名称中不包含冒号的变量,函数和类. 命名空间答应存在冒号,只要不是第一个字符和最后一个字符或接着另一个冒号. 命名空间的名称中的冒号对于PHP来说没有任何意义, 但假如你用他们来区分逻辑上的区块, 他们可以很好地说明你的代码中的父子(parent-child)关系.
/* 注: 即可以使用这样:
namespace animal:dog {}
namespace animal:pig {}
用冒号来说明parent-child关系.
*/
你可能在一个命名空间语句内没有包含函数,类或常量定义以外的任何东西. 这将阻止你使用他们来改进旧的使用全局变量的函数库. 命名空间最适合于面向对象. 命名空间内的常量与类中的常量使用相同的语法.
例子6.17显示了如何使用命名空间.
Listing 6.17 Using a namespace
<?php
namespace core_php:utility
{
class textEngine
{
public function uppercase($text) file://大写
{
return(strtoupper($text));
}
}
//make non-OO interface 建立一个非OO的接口
function uppercase($text)
{
$e = new textEngine;
return($e->uppercase($text));
}
}
//test class in namespace 测试命名空间中的类
$e = new core_php:utility::textEngine;
print($e->uppercase("from object") . "<br>");
//test function in namespace 测试命名空间中的函数
print(core_php:utility::uppercase("from function") . "<br>");
//bring class into global namespace 把类导入全局命名空间
import class textEngine from core_php:utility;
$e2 = new textEngine;
?>
Import语句把命名空间中的某个部份导入全局的命名空间.
要导入单一的命名空间的成员,可以指定类型为constant,function或class,接着写上成员的名称;
//如import class XXX
假如你想导入某一特定类型的所有成员,你可以用*来代替名称;
//如 import constant * 导入所有常量
假如你想导入所有类型的所有成员,用*即可.
//如 import *
在成员之后,用from要害字加上命名空间的名称.
//如 import class textEngine from core_php:utility;
总之你要写成像import * from myNamespace或 import class textEngine from core_php:utility这样的语句,就像例6.17中那样.
<?
$limit=25;
if (!empty($start)) $start=0;
if (!empty($s)) $s=0;
mysql_connect("localhost","","");
mysql_select_db(database);
//统计数据库记录总数
$result=mysql_query("select * from table");
$num=mysql_numrows($result);
$result=mysql_query("select * from table order by id limit $start,$limit");
$numb=mysql_numrows($result);
echo "<table>";
if (!empty($numb)) {
for($i=0;$i<$numb;$i++) {
$val=mysql_result($result,$i,"val");
$val1=mysql_result($result,$i,"val1");
echo "<tr><td>$val</td><td>$val1</td></tr>";
}
}
echo "</table>";
//数字循环翻页的控制
echo "<table>";
echo "<tr><td>页:</td>";
//前翻控制
if ($s>20) {
if ($s==21) {
$st=$s-21;
} else {
$st=$s-20;
}
$pstart=$st*$limit;
echo "<td><a href=page.php?";
echo "start=$pstart&s=$st>prve</a></td>";
}
echo "<td> >></td>";
//设置当前页对应页数无链接功能
$star=$start;
//注意循环的初始附值,仔细想想为什么不是 0
for ($page=$s;$page<($num/$limit);$page++) {
$start=$page*$limit;
echo "<td>";
if($page!=$star/$limit) {
echo "<a href=page.php?";
echo "start=$start&s=$s>";
}
echo $page;
if($page!=$star/$limit) {
echo "</a>";
}
echo "</td>";
//控制数字页面限制显示功能,控制只显示 20 页
if ($page>0 && ($page%20)==0) {
if ($s==0) {
$s=$s+21;
} else {
$s=$s+20;
}
$start=$start+$limit;
if ((($num/$limit)-1)>$page) {
echo "<td> <<</td><td><a href'page.php?";
echo "start=$start&s=$s>next</a></td>";
}
//注意跳出循环的控制
break;
}
}
echo "</tr></table>";
?>
以上的程已序可以完成强大的循环翻页功能
//树型目录结构模板程序
//菜单目录库字段说明:
//menu_id 菜单项目 id
//menu 菜单名称
//menu_grade 菜单等级 1 为主菜单 2 为二级菜单 ........
//menu_superior 上一级菜单 id 号
function my_menu($menu_content,$i,$menu_grade_temp,$menu_superior_temp)
{
global $PHP_SELF;
$temp1=$menu_grade_temp 1;
$menu_superior_temp_array=split("/",$menu_superior_temp);
for ($t=0;$t<$i;$t )
{
$menu_array=split("/",$menu_content[$t]);
If(($menu_array[2]==$menu_grade_temp)&&($menu_array[3]==$menu_superior_temp_array[$menu_grade_temp-1]))
{
for($p=1;$p<=$menu_grade_temp;$p ){echo " ";}
$temp3=$menu_superior_temp_array;
$temp3[$menu_grade_temp]=$menu_array[0];
$temp2=implode("/",$temp3);
if ($menu_array[0]==$menu_superior_temp_array[$temp1-1])
{
$temp5=$temp1-1;
$temp3[$menu_grade_temp]="";
$temp6=implode("/",$temp3);
echo "$menu_array[1]
";
my_menu($menu_content,$i,$temp1,$temp2);
}
else
{
$temp3[$menu_grade_temp 1]="";
$temp6=implode("/",$temp3);
echo "$menu_array[1]
";
}
}
}
}
// 连接 MySql 数据库
$db_host="localhost";
$db_user="dkj";
$db_password="123";
$db_name="test";
mysql_connect($db_host,$db_user,$db_password);
mysql_select_db($db_name);
//从数据库中取得数据
$query_string="select * from menu order by menu_grade";
$db_data=mysql_query($query_string);
//第一次执行初始化
if ($menu_grade_temp=="")
RSS聚合器是一种非凡适合于使用标准AJAX引擎进行构建的应用程序,然而,要实现对RSS回馈的跨域的AJAX请求往往是很难的。在本文中,我将向你展示如何利用一个简单的PHP函数来实现"桥接"AJAX引擎和RSS内容。
一、 引言
现在,开发一个RSS聚合器已经不再是困难的事情,但是开发一个高质量的RSS聚合器却仍然存在相当的难度。另一方面,创建一个定制聚合器一般不是很难,并且在这种聚合器内能够提供一个你自己选择的接口。RSS聚合代表了一类非凡适合于一个AJAX应用程序所消费的数据,这是因为:它是XML格式的,并且AJAX能够良好地显示新的回馈而不必进行页面刷新。然而问题总是存在:在一个标准的AJAX引擎中实现跨域的AJAX请求是不可能的。在本文中,我将向你展示如何利用一个很简单的PHP函数来桥接AJAX引擎和远程内容(在本文中它指的是RSS回馈)。
【提示】 本文假定你已经对PHP有一个基本理解并且有使用AJAX和分析XML的经验。要全面理解本文所提供的示例,你需要下载相应的源码文件。
二、 开始
在我们正式开始前,我想简短地介绍一下我们将用于发出请求的AJAX引擎。该引擎能够简化AJAX调用并且有助于消除当发出请求和调度响应时存在的大量冗余。我不会具体讨论它的组成代码,而仅向你简短地介绍我们在本文中如何使用它。
首先,我们需要导入构成该引擎的所有javascript文件。包含在我们的index.html文件中的代码看起来如下所示:
<script type="text/javascript" src="js/model/HTTP.js"></script>
<script type="text/javascript" src="js/model/Ajax.js"></script>
<script type="text/javascript" src="js/model/AjaxUpdater.js"></script>
一旦我们导入该JavaScript文件,我们就可以通过编写类似下列的代码来发出一个请求:
AjaxUpdater.Update('GET', 'url',callbackMethod);">
该AjaxUpdater是一个对象,它负责处理我们的AJAX调用。我们简单地调用它的Update方法并且传递请求的方法,我们请求的URL,以及我们想把该响应代理到的回调方法。
当发出我们的请求时,这就是所有我们需要关心的。现在,让我们集中于定制RSS聚合器的功能。
三、 入口点
指向该聚合器的入口是index.html文件,我们从浏览器中对它进行调用。下面是描述该index的代码:
<html>
<head>
<title>RSS Aggregation with PHP and Ajax</title>
<link href="CSS/layout.css" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="js/model/HTTP.js"></script>
<script type="text/javascript" src="js/model/Ajax.js"></script>
<script type="text/javascript" src="js/model/AjaxUpdater.js"></script>
<script type="text/javascript" src="js/controller/Aggregator.js"></script>
<script type="text/javascript" src="js/view/Feed.js"></script>
</head>
<body>
<div id="Aggregator">
<form name="feedForm" method="post" action="javascript:AjaxUpdater.Update('GET', 'bridge/rss.php?feed=' document.feedForm.feed.value, Aggregator.Read);">
<div class="header">
<input type="text" name="feed" id="feed" size="50">
<input type="submit" name="submit" value="Add Feed">
</div>
</form>
<div class="leftColumn">
<div id="titles"></div>
<div id="loading"></div>
</div>
<div class="rightColumn">
<div id="description"></div>
</div>
</div>
</body>
</html>
这个文件负责导入处理我们的聚合器显示的CSS文件和所有的用于创建该聚合器和发出AJAX请求的JavaScript文件。
我在以前写过怎么使用c#来压缩和解压缩swf文件,解压缩,压缩和读取flash头文件信息需要使用一个开源的链接库,而且使用起来也不是很方便,但是使用php就不一样了,php包含了zlib的链接库,可以直接使用其相关功能,下面是我写的压缩和结压缩swf文件的例子:
//没有加入判定swf文件是否已经压缩,入需要可以根据文件的第一个字节是'F'或者'C'来判定
压缩swf文件:
<?php
//-------------------------------------------------------------------------
//文件名
$filename = "test.swf";
//打开文件
$rs = fopen($filename,"r");
//读取文件的数据
$str = fread($rs,filesize($filename));
//设置swf头文件
$head = substr($str,1,8);
$head = "C".$head;
//获取swf文件内容
$body = substr($str,8);
//压缩文件内容,使用最高压缩级别9
$body = gzcompress($body, 9);
//合并文件头和内容
$str = $head.$body;
//关闭读取的文件流
fclose($rs);
//创建一个新的文件
$ws = fopen("create.swf","w");
//写文件
fwrite($ws,$str);
//关闭文件留
fclose($ws);
//------------------------------------------------------------------------
?>
解压缩swf文件:
<?php
//----------------------------------------------------------------------------
//文件名
$filename = "test.swf";
//打开文件
$rs = fopen($filename,"r");
//读取文件的数据
$str = fread($rs,filesize($filename));
//设置swf头文件
$head = substr($str,1,8);
$head = "F".$head;
//获取swf文件内容
$body = substr($str,8);
//解压缩文件内容
$body = gzuncompress($body);
//合并文件头和内容
$str = $head.$body;
//关闭读取的文件流
fclose($rs);
//创建一个新的文件
$ws = fopen("create.swf","w");
//写文件
fwrite($ws,$str);
//关闭文件留
fclose($ws);
//-------------------------------------------------------------------------------
?>
怎么样?是不是很简单?呵呵,php给我们的不止是简单...
相关文章
- 本文主要介绍了C#变量命名规则小结,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-09
- 这篇文章主要介绍了解决IDEA占用C盘空间过大的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-22
- 这篇文章主要给大家介绍了关于阿里规范:为何boolean类型变量命名禁用is开头的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-08-31
- 这篇文章主要给大家介绍了关于Swift中命名空间的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-30
- 下面小编就为大家带来一篇老生常谈javascript变量的命名规范和注释。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2016-10-02
- 这篇文章主要介绍了c# 如何使用 My 命名空间,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...2020-12-08
- 这篇文章主要介绍了C# 命名空间(Namespace)的相关知识,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以参考下...2020-11-03
- 这篇文章主要介绍了Redis swap空间的使用示例,帮助大家更好的理解和学习使用Redis数据库,感兴趣的朋友可以了解下...2021-03-25
- namespace即“命名空间”,也称“名称空间” 、”名字空间”。接下来通过本文给大家介绍JavaScript中命名空间namespace模式的相关知识,非常不错,具有参考借鉴价值,感兴趣的朋友一起学习吧...2016-06-24
- 这篇文章主要介绍了R语言变量重编码、重命名的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-05-06
- 这篇文章主要介绍了Redis开启键空间通知实现超时通知的步骤,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-01-15
- PHP的命名空间(namespace)是php5.3之后才有的之前学习php所以没有这个东西了,最近用到了php命名空间了,下面我们一起来看看命名空间namespace用法 现在说这个,感觉有...2016-11-25
- 这篇文章主要介绍了Oracle如何设置表空间数据文件大小,文中讲解非常细致,帮助大家更好的理解和学习,感兴趣的朋友可以了解下...2020-07-22
- .net的命名空间类库的简单介绍,需要的朋友可以参考一下...2020-06-25
- 今天小编在这里就来给美图秀秀的这一款软件的使用者们来说一下制作QQ空间MM签名的教程,各位想知道具体制作步骤的使用者们,那么下面就快来跟着小编一起看一下吧。 ...2016-09-14
- 这篇文章主要介绍了python标识符命名规范原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-04-27
- 当一个项目变得大型之后,我们会引入很多的库,这么一来两个库很可能会定义List、Tree、Node同名的类,编译器要是不考虑这情况的话,程序员调用时就会出现冲突问题。C++提供了名称空间工具,以更好的控制名称的作用域,本文就来谈谈C++ 名称空间,需要的朋友可以参考一下...2021-09-24
- 这篇文章主要介绍了Java中XML Namespace 命名空间,XML命名空间是由国际化资源标识符 (IRI) 标识的 XML 元素和属性集合,该集合通常称作 XML“词汇”,对XML Namespace 命名空间相关知识感兴趣的朋友一起看看吧...2021-08-14
- 集合是一些有共同特征的独立数据项组成的,通过集合,我们可以可以使用相同的调用代码来处理一个集合的所有元素,而不用单独处理每一个单独的项...2021-09-22
- 小米手机云空间不足怎么办?使用小米云空间存储照片,视频等,最近发现空间不够用了,估计是视频存的太多了,该怎么办呢?今天和大家分享一下解决小米云空间不足的详细教程,需要的朋友可以参考下...2016-07-04