PHP的命名空间学习笔记与测试
PHP命名空间是PHP5.3开始支持。本篇讲解PHP命名空间用法和PHP命名空间详解。它的诞生使的我们在一个文件中可以使用多个同名的类而不冲突。
好处:我们的项目有一个记录日志文件的类,叫做Log。然后我们又必须要引入另一个代码包,这个代码包里也有一个叫做Log的类。那么在一个文件中,我们记录日志的又需要给两个类都写一条日志。可以类同名了,怎么办?这个时候,命名空间应运而生。在Java等语言中命名空间是很早就已经提供了支持,而我大PHP一直到5.3才对命名空间提供了支持。
示例一:
文件index.php
<?php
include 'test.php';
class index{
public function a(){
echo basename(__FILE__);
echo '<br>';
echo __CLASS__ . ' : ' . __METHOD__;
}
}
$obj = new index();
$obj->a();
echo '<br>';
$obj1 = new test\index();
$obj1->a();
?>
文件test.php
<?php
namespace test;
class index{
public function a(){
echo basename(__FILE__);
echo '<br>';
echo __CLASS__ . ' : ' . __METHOD__;
}
}
?>
我们给index.php不设置命名空间,对test.php设置命名空间,名为test。运行index.php。
结果:
index.php
index : index::a
test.php
test\index : test\index::a
我们看到了,同名的类也可以运行而不冲突了。
示例二:
文件index.php
<?php
namespace index;
include 'test.php';
class index{
public function a(){
echo basename(__FILE__);
echo '<br>';
echo __CLASS__ . ' : ' . __METHOD__;
}
}
$obj = new index();
$obj->a();
echo '<br>';
$obj1 = new \test\index();
$obj1->a();
?>
文件test.php
<?php
namespace test;
class index{
public function a(){
echo basename(__FILE__);
echo '<br>';
echo __CLASS__ . ' : ' . __METHOD__;
}
}
?>
我们给index.php设置命名空间,名为index,对test.php设置命名空间,名为test。运行index.php。
结果:
index.php
index\index : index\index::a
test.php
test\index : test\index::a
比较示例一和二,不对index.php设置命名空间,即该文件是整个PHP全局命名空间下面的一个文件,那么使用test\index()即可,如果对index.php设置命名空间,即在其他的命名空间中使用命名空间,就要多一个“\”,就要使用\test\index()。
示例三:
文件index.php
<?php
namespace index;
include 'namespace.php';
use \test\test1\test2 as test2;
class index{
public function a(){
echo basename(__FILE__);
echo '<br>';
echo __CLASS__ . ' : ' . __METHOD__;
}
}
$obj = new index();
$obj->a();
echo '<br>';
$obj1 = new \test\test1\test2\index();
$obj1->a();
echo '<br>';
$obj1 = new test2\index();
$obj1->a();
文件test.php
<?php
namespace test\test1\test2;
class index{
public function a(){
echo basename(__FILE__);
echo '<br>';
echo __CLASS__ . ' : ' . __METHOD__;
}
}
结果:
index.php
index\index : index\index::a
test.php
test\test1\test2\index : test\test1\test2\index::a
test.php
test\test1\test2\index : test\test1\test2\index::a
这说明了什么?别名!用过SQL吧。
select COUNT(*) as `count` from `tebleName`
嗯,一个意思。\test\test1\test2这个名字太长了,就别名为test2就好了。使用了use之后呢,这个命名空间就想到于是在index这个命名空间下面了,而不是全局命名空间的一员了,所以使用test2\index(),而不是\test2\index()。
别名时在PHP代码编译的时候执行的,而变量的解析则要更晚。也就是说不能对变量运用use关键字。示例如下(摘自官方手册示例):
<?php
use My\Full\Classname as Another, My\Full\NSname;
$obj = new Another; // 实例化一个 My\Full\Classname 对象
$a = 'Another';
$obj = new $a; // 实际化一个 Another 对象
用文件的方式读写,一个文件是索引文件,另一个文件是真实的数据文件。
索引文件分为2部分,第一部分是所有的指针,记录第二部分的位置;第二部分是索引记录。所有的索引指针:是记录所有相同Hash值的key的指针,它是一个链表结构,记录在数据文件的位置和同key的下一个值。
索引记录中:每条记录有四部分,第一部分4个字节,是下一条索引的偏移量;第二部分是该记录的key,128字节;第三部分是数据偏移量,4个字节;第四部分是数据记录长度,4个字节。
我们设定文件的存储上限为262144个。
查找流程如下:
1、根据key算出hash值,获取该hash值的链表在索引文件的第一部分(所有指针区)的位置。
2、根据步骤一的位置,获取值,时间复杂度O(1);
2、根据步骤一中的值,找到索引文件中第二部分(索引记录)的位置,也就是和key相同hash值的所有指针的链表。顺着链表查找该key,获取该key在链表中存放的数据,数据只包含该key在索引文件中的位置,时间复杂度为O(n);
3、根据步骤二所获取的key在索引文件位置,得到索引文件中存放该key的信息。信息包含在真实数据文件中存放真实数据的位置。
4、根据步骤三所获取的位置,在真实数据文件中获取数据,并返回给应用程序。
测试结果:插入10000条耗时:793ms。查找10000条耗时:149ms。虽然这效率只有Redis的十分之一。。。但是请不要在意这些细节。。。
代码做了注释,上述文字有些乱。代码只实现三个方法,一个插入(如果存在则跳过),一个是查找,一个是删除。
思路来源:《PHP核心技术与最佳实践》一书。尊重作者,转载请保留该书名。
代码如下 | 复制代码 |
<?php //成功-返回码 class DB{ /** return DB_SUCCESS; /** /** $idxoff = fstat($this->idx_fp); $datoff = fstat($this->dat_fp); $keylen = strlen($key); fseek($this->idx_fp, 0, SEEK_END); fseek($this->dat_fp, 0, SEEK_END); return DB_SUCCESS; if($found){ /** $found = false; if(!strncmp($key, $cpkey, strlen($key))){ $datalen = unpack('L', substr($block, DB_KEY_SIZE + 8, 4)); $found = true; /** $next = unpack('L', substr($block, 0, 4)); $cpkey = substr($block, 4, DB_KEY_SIZE); public function close(){ |
测试,测试添加一万条和查找一万条:
代码如下 | 复制代码 |
<?php $startTime = microtime(true); //插入测试...插入10000条:成功,耗时: 793.48206520081ms //查找测试...查找10000条:成功,耗时: 149.08313751221ms $endTime = microtime(true); |
一个比较简单的php文件上传范例,可用于要求不高的时候,记录到这里,方便以后要用的时候直接过来复制。
$resume = $_FILES['resumefile'];
if($resume['name']!='')
{
$enableType = array('jpg','png','gif','doc','docx','rtf','pdf'); //支持格式
$maxSize = 1024*1024; //最大允许上传1M的文件
$filePath = 'upload/resume/';
$suffix = end(explode('.', $resume['name'])); //获取文件后缀名
$resumeName = 'resume_'.time().'.'.$suffix;
//大小限制
if($resume['size']>$maxSize)
{
die("<script> alert('请上传1M以下的文件!'); history.back(); </script>");
}
//格式限制
if(!in_array($suffix, $enableType))
{
die("<script> alert('格式不正确,请上传 ".implode(', ', $enableType)." 格式的文档!'); history.back(); </script>");
}
//上传
if(move_uploaded_file($resume['tmp_name'], $filePath.$resumeName))
{
$attachment = $filePath.$resumeName; //文件名,写入数据库
}
}
我们在一些应用中需要动态展示数据,比如当前在线人数,当前交易总额,当前汇率等等,前端页面需要实时刷新获取最新数据。本文将结合实例给大家介绍使用jQuery和PHP来实现动态数字展示效果。
本例假设要在页面上动态展示(无需刷新整个页面,只是局部刷新动态数字)当前在线用户数,常见在一些统计平台上应用。在HTML页面中只需定义以下结构:
代码如下 | 复制代码 |
<div class="count">当前在线:<span id="number"></span></div> |
首先我们要定义一个动画过程,使用jQuery的animate()函数实现从一个数字到另一个数字的变换过程,以下magic_number()自定义函数将代码整合如下:
代码如下 | 复制代码 |
function magic_number(value) { var num = $("#number"); num.animate({count: value}, { duration: 500, step: function() { num.text(String(parseInt(this.count))); } }); }; |
然后update()函数使用了jQuery的$.getJSON()向后台number.php发送了一个ajax请求,在得到PHP相应后,调用magic_number()展示最新的数字。为了能看到更好的效果,我们使用setInterval()设置代码执行的间隔时间。
代码如下 | 复制代码 |
function update() { $.getJSON("number.php?jsonp=?", function(data) { magic_number(data.n); }); }; setInterval(update, 5000); //5秒钟执行一次 update(); |
PHP
实际项目中,我们会使用PHP获取数据库中的最新数据,然后通过PHP返回给前端。本例为了更好的演示,使用随机数字,最后以json格式返回给前端js,number.php代码如下:
代码如下 | 复制代码 |
$total_data = array( |
原理其实非常的简单就是利用js settimeout实现过几秒加载一个php文件从而达到了实时显示在线人数的功能了。
PHP大小写问题算是一个入门级的教程了,在此小编为php初学者介绍php开发中大小写的一些例子,希望可以帮助到各位。今天写代码的时候发现自己代码的一处错误:
$m_category->Insert($data);
我调用了$m_category对象的insert方法,奇怪的是,我自己编写的框架里insert方法名是小写的,但是我这里调用的首字母大写了(公司的框架Model类的方法均为首字母大写,有时候习惯了回家写代码不容易写错)。
但是很奇怪的是,这段代码在之前的测试是通过的,并没有报错或什么,数据也正常写入了,有些思不得解,于是尝试做了一个实验。
就从控制器开始吧,我当前控制器中有一个方法是addWiki,那么我新增一个方法addwiki,然后等待了一下,IDE没有为我这个新的方法报错。松了一口气,看来PHP对大小写是敏感的。然后我尝试调用addwiki这个方法,这时候让我惊讶的事情发生了:PHP向我抛出了一个致命错误:addwiki无法被重定义。看样子PHP对方法名的大小写还是不敏感呀。
还是不死心,也许是我PHP配置的问题,于是上网查找之,找到了不少资料,原来PHP对类名和方法名是大小写不敏感的。
下面抄一些别处的资料,区分PHP大小写敏感的地方。
1. 变量名区分大小写
2. 常量名默认区分大小写
3. 函数名、方法名、类名不区分大小写
4. 魔术常量不区分大小写,推荐大写
5. NULL、TRUE、FALSE不区分大小写
除了变量名和常量名区分大小写以外,其他统统不区分。不过在我们正常的使用中,都有常量名、魔术变量使用大写的习惯,而NULL、TRUE、FALSE在不少框架中也被推荐使用大写(虽然我自己喜欢用小写),因此问题也不大。据说常量名可以设置为大小写敏感,不过没去查找这方面资料,也不清楚了,当然还是按照约定来使用大写吧。
重点就在于类、方法、函数名这一点上,好吧,我一直认为类和方法名是大小写敏感的,至今才知道:-(
不过建议还是注意大小写的好,毕竟PHP不知哪天哪个版本就改掉了这条特性,不再支持大小写不敏感的函数、方法名了
为了让各位更深入了解php中大小写我们整理了一些例子
一、大小写敏感
1. 变量名区分大小写
所有变量均区分大小写,包括普通变量以以及$_GET, $_POST, $_REQUEST, $_COOKIE, $_SESSION, $GLOBALS, $_SERVER, $_FILES, $_ENV等;
<?php
$abc = 'abcd';
echo $abc; //输出 'abcd'
echo $aBc; //无输出
echo $ABC; //无输出
2. 常量名默认区分大小写,通常都写为大写
(但没找到能改变这个默认的配置项,求解)
1 <?php
define("ABC","Hello World");
echo ABC; //输出 Hello World
echo abc; //输出 abc
3. php.ini配置项指令区分大小写
如 file_uploads = 1 不能写成 File_uploads = 1
二、大小写不敏感
4. 函数名、方法名、类名 不区分大小写,但推荐使用与定义时相同的名字
<?php
function show(){
echo "Hello World";
}
show(); //输出 Hello World 推荐写法
SHOW(); //输出 Hello World
<?php
class cls{
static function func(){
echo "hello world";
}
}
Cls::FunC(); //输出hello world
5. 魔术常量不区分大小写,推荐大写
包括:__LINE__、__FILE__、__DIR__、__FUNCTION__、__CLASS__、__METHOD__、__NAMESPACE__。
<?php
echo __line__; //输出 2
echo __LINE__; //输出 3
6. NULL、TRUE、FALSE不区分大小写
<?php
$a = null;
$b = NULL;
$c = true;
$d = TRUE;
$e = false;
$f = FALSE;
var_dump($a == $b); //输出 boolean true
var_dump($c == $d); //输出 boolean true
var_dump($e == $f); //输出 boolean true
7.类型强制转换,不区分大小写,包括:
* (int),(integer) – 转换成整型
* (bool),(boolean) – 转换成布尔型
* (float),(double),(real) – 转换成浮点型
* (string) – 转换成字符串
* (array) – 转换成数组
* (object) – 转换成对象
<?php
$a=1;
var_dump($a); //输出 int 1
$b=(STRING)$a;
var_dump($b); //输出string '1' (length=1)
$c=(string)$a;
var_dump($c); //输出string '1' (length=1)
相关文章
- 这篇文章主要介绍了解决IDEA占用C盘空间过大的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-22
- 我们在php中上传文件就必须使用#_FILE变量了,这个自动全局变量 $_FILES 从 PHP 4.1.0 版本开始被支持。在这之前,从 4.0.0 版本开始,PHP 支持 $HTTP_POST_FILES 数组。这...2016-11-25
- 1、简介Smarty是一个使用PHP写出来的模板PHP模板引擎,是目前业界最著名的PHP模板引擎之一。它分离了逻辑代码和外在的内容,提供了一种易于管理和使用的方法,用来将原本与HTML代码混杂在一起PHP代码逻辑分离。简单的讲,目...2014-05-31
- 当我们在星际中开地图和几家电脑作战的时候,电脑的几个玩家相当于结盟,一旦我们出兵进攻某一家电脑,其余的电脑会出兵救援。 那么如何让各家电脑知道自己的盟友被攻击了...2016-11-25
- 这篇文章主要给大家介绍了关于Swift中命名空间的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-30
- 这篇文章主要介绍了c# 如何使用 My 命名空间,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...2020-12-08
- 举一个简单的date例子 我将使用echo命令把内容输出到我们的客户端(浏览器)。我将使用下面的代码做为基础代码。 代码如下 复制代码 <!DOCTY...2016-11-25
- 这篇文章主要介绍了C# 命名空间(Namespace)的相关知识,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以参考下...2020-11-03
- 这篇文章主要介绍了Redis swap空间的使用示例,帮助大家更好的理解和学习使用Redis数据库,感兴趣的朋友可以了解下...2021-03-25
- namespace即“命名空间”,也称“名称空间” 、”名字空间”。接下来通过本文给大家介绍JavaScript中命名空间namespace模式的相关知识,非常不错,具有参考借鉴价值,感兴趣的朋友一起学习吧...2016-06-24
- 这篇文章主要介绍了Redis开启键空间通知实现超时通知的步骤,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-01-15
- PHP的命名空间(namespace)是php5.3之后才有的之前学习php所以没有这个东西了,最近用到了php命名空间了,下面我们一起来看看命名空间namespace用法 现在说这个,感觉有...2016-11-25
- 一篇Android学习笔记之多界面切换实例,希望对各位朋友有所帮助。 用过VB 、 VC#的朋友都知道,在VB或VC#里要进行窗口(界面)切换很容易 例如在VB、C#里: 有 Fom1、...2016-09-20
- 引用:意思是将原始对象在内存中的地址传递给目标对象,就相当于原始对象和目标对象指向的是同一个内存地址。此时,如果对目标对象或者原始对象进行修改,内存中的数据也会改...2016-11-25
- 这篇文章主要介绍了Oracle如何设置表空间数据文件大小,文中讲解非常细致,帮助大家更好的理解和学习,感兴趣的朋友可以了解下...2020-07-22
- cURL是php中一个很强大的功能,可以模仿各种用户请求,如模仿用户登录,发送php cookie等等操作,下面我来整理一些相关的方法与各位同学看看 备注:使用curl_init函数,必须...2016-11-25
- 那些年学了ASP.NET后,才开始学习C#,说来也怪,怎么学了ASP.NET才来学习C#,其实没有什么的...2020-06-25
- CWidget是所有Widget的基类。CWidget是自包含组件,可以看出是MVC的简略版,CWidget相比Controller,既没有actions,也没有filters widget,英文意思为小工具,小挂件,在程序...2016-11-25
- .net的命名空间类库的简单介绍,需要的朋友可以参考一下...2020-06-25
- Metasploit是一个免费的、可下载的框架,通过它可以很容易地获取、开发并对计算机软件漏洞实施攻击。它本身附带数百个已知软件漏洞的专业级漏洞攻击工具 nexpose安...2016-11-25