PHP面向对象(OOP)编程:this的特殊用法

 更新时间:2016年11月25日 14:57  点击:1563
现在我们知道了如何访问对象中的成员,是通过”对象->成员”的方式访问的,这是在对象的外部去访问对象中成员的形式, 那么如果我想在对象的内部,让对象里的方法访问本对象的属性
或是对象中的方法去调用本对象的其它方法这时我们怎么办?因为对象里面的所有的成员都要用对象来调用,包括对象的内部成员之间的调用,所以在PHP里面给 我提供了一个本对象的引用$this, 每个对象里面都有一个对象的引用$this来代表这个对象,完成对象内部成员的调用, this的本意就是“这个”的意思, 上面的实例里面,我们实例化三个实例对象$P1、 $P2、 $P3,这三个对象里面各自存在一个$this分别代表对象$p1、$p2、$p3 。
PHP面向对象(OOP)编程:“$this”的特殊用法
通过上图我们可以看到,$this就是对象内部代表这个对象的引用,在对象内部和调用本对象的成员和对象外部调用对象的成员所使用的方式是一样的。
 代码如下 复制代码
$this->属性: $this->name; $this->age; $this->sex;
$this->方法 :$this->say(); $this->run();
修改一下上面的实例,让每个人都说出自己的名字,性别和年龄:
 代码如下 复制代码

<?php
class Person
{
 //下面是人的成员属性
 var $name; //人的名子
 var $sex; //人的性别
 var $age; //人的年龄

 //下面是人的成员方法
 function say() { //这个人可以说话的方法
  echo "我的名子叫:" . $this->name . " 性别:" . $this->sex . " 我的年龄是:" . $this->age;
 }

 function run() { //这个人可以走路的方法
  echo "这个人在走路";
 }
}

$p1 = new Person(); //创建实例对象$p1
$p2 = new Person(); //创建实例对象$p2
$p3 = new Person(); //创建实例对象$p3

//下面三行是给$p1对象属性赋值
$p1->name = "张三";
$p1->sex = "男";
$p1->age = 20;

//下面访问$p1对象中的说话方法
$p1->say();

//下面三行是给$p2对象属性赋值
$p2->name = "李四";
$p2->sex = "女";
$p2->age = 30;

//下面访问$p2对象中的说话方法
$p2->say();

//下面三行是给$p3对象属性赋值
$p3->name = "王五";
$p3->sex = "男";
$p3->age = 40;

//下面访问$p3对象中的说话方法
$p3->say();
?>

输出结果为:

我的名子叫:张三 性别:男 我的年龄是:20我的名子叫:李四 性别:女 我的年龄是:30我的名子叫:王五 性别:男 我的年龄是:40

分析一下这个方法:

 代码如下 复制代码

function say() { //这个人可以说话的方法
 echo "我的名子叫:" . $this->name . " 性别:" . $this->sex . " 我的年龄是:" . $this->age;
}

在$p1、$p2和$p3这三个对象中都有say()这个方法,$this分别代表这三个对象, 调用相应的属性,打印出属性的值,这就是在对象内部访问对象属性的方式, 如果相在say()这个方里调用run()这个方法也是可以的,在say()这个方法中使用$this->run()的方式来完成调用。

PHP引用符&是一个用来传值或传地址的方法了,下面为了让大家更清楚PHP引用符&的用法我们整理了一些例子各位可进入参考。

关于php的引用(就是在变量或者函数、对象等前面加上&符号)的作用,我们先看下面这个程序。

 代码如下 复制代码

<?php
$a = 100; //声明变量a
$b = &$a; //声明变量b,引用自变量a
echo "$a <br />"; 
echo "$b <br />";
$a++; //变量a自增1
echo "$a <br />";
echo "$b <br />";//查看变量b,也增加了1,说明使用的是同一存储单元
?>
程序运行结果:

100
100
101
101

很多人误解php中的引用跟C当中的指针一样,事实上并非如此,而且很大差别。C语言中的指针除了在数组传递过程中不用显式申明外,其他都需要使用*进行定义,而php中对于地址的指向(类似指针)功能不是由用户自己来实现的,是由Zend核心实现的,php中引用采用的是“写时拷贝”的原理,就是除非发生写操作,指向同一个地址的变量或者对象是不会被拷贝的。

php默认为传值传递:

 代码如下 复制代码

<?php   
$a = 20;
$b = $a;
$a = $a + 10;
echo $a.' and '.$b;
?>
程序运行结果:

30 and 20

要是想变为地址传递需要加&,既:

 代码如下 复制代码

<?php
$a = 20;
$b = &$a;
$a = $a + 10;
echo $a.' and '.$b;
?>
程序运行结果:

30 and 30

也就是说,&把$a的地址传给了$b,这样的话这两个变量现在共享一个内存的存储区域,就是说它们的值是一样的。

同样的语法可以用在函数中,它返回引用,以及用在 new 运算符中:

 代码如下 复制代码
<?php
$bar =& new fooclass();
$foo =& find_var($bar);
?>

引用做的第二件事是用引用传递变量。这是通过在函数内建立一个本地变量,并且该变量在呼叫范围内引用了同一个内容来实现的。说的通俗点就是一个函数的参数是一个本地变量的引用。下面再举例说明一下:

 代码如下 复制代码
<?php
function foo(&$val1, $val2) {
 $val1 += 1;
 $val2 += 1;
}
$a=5;
$b=10;
foo($a,$b);
echo $a;
echo $b;
?>

运行这段代码是给函数传递两个参数,一个是引用$a的内容,一个是$b的值,在执行此函数后,发现$a的内容改变了,而$b的内容则没有变化。

PHP引用的第三个用法是引用返回,这个用法理解起来有点难度,引用返回用在当你想用函数找到引用应该被绑定在哪一个变量上面时。当返回引用时,使用此语法:说的简单点,就还是引用函数的返回。但和参数传递不同,必须在函数定义和函数引用这两个地方都用 & 符号。下面举个例子:

 代码如下 复制代码
<?php
function &find_var ($param)
{
    /* ...code... */
    return $found_var;
}
$foo =& find_var ($bar);
$foo->x = 2;
?>

这个例子给$foo 赋值是函数find_var的返回引用,所以在给$foo->x赋值时就是给find_var的返回引用赋值,而不是简单的赋值。

函数的传址调用

传址调用我就不多说了,下面直接给出代码:

 代码如下 复制代码
function test(&$a)
{
$a=$a+100;
}
$b=1;
echo $b;//输出1
test($b);   //这里$b传递给函数的其实是$b的变量内容所处的内存地址,通过在函数里改变$a的值 就可以改变$b的值了
echo "<br />";
echo $b;//输出101

要注意的是,在这里test(1);的话就会出错,原因自己去想。
函数的引用返回
先看代码:

 代码如下 复制代码

function &test()
{
static $b=0;//申明一个静态变量
$b=$b+1;
echo $b;
return $b;
}

$a=test();//这条语句会输出 $b的值 为1
$a=5;
$a=test();//这条语句会输出 $b的值 为2

$a=&test();//这条语句会输出 $b的值 为3
$a=5;
$a=test();//这条语句会输出 $b的值 为6

通过这种方式$a=test();得到的其实不是函数的引用返回,这跟普通的函数调用没有区别。至于原因:这是PHP的规定。PHP规定通过$a=&test(); 方式得到的才是函数的引用返回。至于什么是引用返回呢(PHP手册上说:引用返回用在当想用函数找到引用应该被绑定在哪一个变量上面时。)
用上面的例子来解释就是:
$a=test()方式调用函数,只是将函数的值赋给$a而已,而$a做任何改变都不会影响到函数中的$b。而通过$a=&test()方式调用函数呢,他的作用是将return $b中的 $b变量的内存地址与$a变量的内存地址 指向了同一个地方即产生了相当于这样的效果($a=&b;) 所以改变$a的值也同时改变了$b的值,所以在执行了

 代码如下 复制代码
$a=&test();
$a=5;

以后,$b的值变为了5。
这里是为了让大家理解函数的引用返回才使用静态变量的,其实函数的引用返回多用在对象中。
对象的引用

 代码如下 复制代码
<?
class a{
var $abc="ABC";
}
$b=new a;
$c=$b;
echo $b->abc;//这里输出ABC
echo $c->abc;//这里输出ABC
$b->abc="DEF";
echo $c->abc;//这里输出DEF
?>

在PHP5中对象的复制是通过引用来实现的。上列中$b=new a; $c=$b; 其实等效于$b=new a; $c=&$b;PHP5中默认就是通过引用来调用对象,但有时你可能想建立一个对象的副本,并希望原来的对象的改变不影响到副本。为了这样的目的,PHP定义了一个特殊的方法,称为__clone.
引用的作用:如果程序比较大,引用同一个对象的变量比较多,并且希望用完该对象后手工清除它,个人建议用 "&" 方式,然后用$var=null的方式清除。其它时候还是用php5的默认方式吧。另外,php5中对于大数组的传递,建议用 "&" 方式,毕竟节省内存空间使用。
当你 unset 一个引用,只是断开了变量名和变量内容之间的绑定。这并不意味着变量内容被销毁了。例如:

 代码如下 复制代码
<?php
$a = 1;
$b =& $a;
unset ($a);
?> 

不会 unset $b,只是 $a。
当用 global $var 声明一个变量时实际上建立了一个到全局变量的引用。也就是说和这样做是相同的:

 代码如下 复制代码
<?php
$var =& $GLOBALS["var"];
?> 

这意味着,例如,unset $var 不会 unset 全局变量。
$this 在一个对象的方法中,$this 永远是调用它的对象的引用。
php中对于地址的指向(类似指针)功能不是由用户自己来实现的,是由Zend核心实现的,php中引用采用的是"写时拷贝"的原理,就是除非发生写操作,指向同一个地址的变量或者对象是不会被拷贝的。
通俗的讲,如果有下面的代码:
$a="ABC";
$b=$a;
其实此时$a与$b都是指向同一内存地址,而并不是$a与$b占用不同的内存。
如果在上面的代码基础上再加上如下代码:
$a="EFG";
由于$a与$b所指向的内存的数据要重新写一次了,此时Zend核心会自动判断 自动为$b生产一个$a的数据拷贝,重新申请一块内存进行存储。

php中一行代码获取文件后缀名的方法要结合很多的函数了,我们这个有点像asp中的函数了,下面来一起看看吧。

实例:

 代码如下 复制代码

$filename  = 'D:/wamp/www/sparkphp/rar';
$rs =  strtolower(trim(substr(strrchr($filename, ”.“), 1)));

详解:

strrchr()函数查找字符串在另一个字符串中最后一次出现的位置,并返回从该位置到字符串结尾的所有字符;
substr()函数是返回字符串的一部分, 1表示从字符串下标第一个读起。直到结尾;
trim()函数是去掉字符串前后空格;
strtolower()函数是把字符串转换为小写。

补充其它方法

 代码如下 复制代码

<?php
 //方法一:
 function extend_1($file_name)
 {
 $retval="";
 $pt=strrpos($file_name, ".");
 if ($pt) $retval=substr($file_name, $pt+1, strlen($file_name) - $pt);
 return ($retval);
 }
 
 //方法二
 function extend_2($file_name)
 {
 $extend = pathinfo($file_name);
 $extend = strtolower($extend["extension"]);
 return $extend;
 }
 
 //方法三
 function extend_3($file_name)
 {
 $extend =explode("." , $file_name);
 $va=count($extend)-1;
 return $extend[$va];
 }
 ?>

php中die()与exit()的真正区别是什么因,我们百度一下发现die是退出并释放内存,exit是退出但不释放内存了,那么真的是这样吗,下面来看看吧。

网上搜索die与exit两个函数的区别,大部分的”标准答案”都是说die是退出并释放内存,exit是退出但不释放内存。
这个解释显然是错的,PHP手册中已经说过“die — Equivalent to exit().This language construct is equivalent to exit(). ”两者只是别名关系,除此之外完全一样。
不过我还是很好奇,决定从源码中找找线索,看看php是如何处理的这个“别名”。
首先要清楚一点,die和exit都是”language construct”而非函数,网上也有很多说某某某有返回值是函数,某某无返回值是结构,很多初学者总搞不清语言结构和函数的区别,用通俗点的话讲,语言结构可以理解为语法本身的一种标识。像+、-、*、/这些也都是语言结构,if、else、for、while,这些都是语言结构。是语法本身的一部分。任何语言都会有这些东西,因为计算机看到+不会认为是应该做加法的。这需要编译器转换为机器码也就是cpu能够识别的指令集。
php执行源码时的整个过程为,首先按照zend_language_scanner.l中定义的,将源码中的echo、if之类的语言结构转换成类似的T_ECHO、T_IF这些token,并且会去掉源码中的空格,注释这些与程序逻辑无关的字符。,就形成了一些简短的表达式,这就是词法分析阶段。然后会按照zend_vm_opcodes.h中定义的,将这些token转换为op code。然后一条一行的执行这些op code。
上面大概解释了php的编译和执行的过程,以及语言结构的定义。下面进入正题。
我们也应该记得,php中有很多别名函数,比如:implode和join。无论是别名函数还是别名语言结构,从实际效果角度讲,都是一样的,不过源码的处理方式肯定还是不一样的。
我们先看看这个别名语言结构是如何处理的,稍后再看别名函数。
zend_language_parser.c中,定义了一个宏
#define T_EXIT 300
还定义了一个enum,里面也有

 代码如下 复制代码
enum yytokentype {

T_EXIT = 300,
….
}
这里告诉我们,T_EXIT这个token,它的code是300。
再看zend_language_scanner.l,其中有这么几行代码。
 代码如下 复制代码
<ST_IN_SCRIPTING>”exit” {
return T_EXIT;
}
<ST_IN_SCRIPTING>”die” {
return T_EXIT;
}
很明显,php做词法分析时,无论遇到exit还是die,都会返回T_EXIT这个token。从这里酒可以证明,die和exit,再php内部处理是完全一样的。
也可以用下列php代码来确定:
 代码如下 复制代码
<?php
var_dump(token_get_all(“<?php die;exit;?>”));
返回的结果中die和exit对应的token code,都是300。
现在关于die和exit的问题,我想大家应该可以确定了,只是名字不同,效果都是一样的,没有所谓的卸不卸载内存的问题。

PHP手册:die()Equivalent to exit()。

说明:die()和exit()都是中止脚本执行函数;其实exit和die这两个名字指向的是同一个函数,die()是exit()函数的别名。该函数只接受一个参数,可以是一个程序返回的数值或是一个字符串,也可以不输入参数,结果没有返回值。
参考:虽然两者相同,但通常使用中也有细微的选择性。例如:
当传递给exit和die函数的值为0时,意味着提前终止脚本的执行,通常用exit()这个名字。

 代码如下 复制代码
echo "1111";
exit(0);
echo "2222";
//22222不会被输出,因为程序运行到exit(0)时,脚本已经被提前终止,“马上断气”。

当程序出错时,可以给它传递一个字符串,它会原样输出在系统终端上,通常使用die()这个名字。

 代码如下 复制代码
$fp=fopen("./readme.txt","r") or die("不能打开该文件");

//这种情况下,如果fopen函数被调用返回布尔值false时,die()将立即终止脚本,并马上打印
//传递给它的字符串,“死前还能说一两句话”。

phpredis是php的一个扩展,效率是相当高有链表排序功能,对创建内存级的模块业务关系 很有用;以下是redis官方提供的命令使用技巧

下载地址如下:
https://github.com/owlient/phpredis
Redis::__construct构造函数
$redis = new Redis();
connect, open 链接redis服务
参数
host: string,服务地址
port: int,端口号
timeout: float,链接时长 (可选, 默认为 0 ,不限链接时间)
注: 在redis.conf中也有时间,默认为300
pconnect, popen 不会主动关闭的链接
参考上面
setOption 设置redis模式
getOption 查看redis设置的模式
ping 查看连接状态
get 得到某个key的值(string值)
如果该key不存在,return false
set 写入key 和 value(string值)
如果写入成功,return ture
setex 带生存时间的写入值
$redis->setex(‘key’, 3600, ‘value’); // sets key → value, with 1h TTL.
setnx 判断是否重复的,写入值
$redis->setnx(‘key’, ‘value’);
$redis->setnx(‘key’, ‘value’);
delete  删除指定key的值
返回已经删除key的个数(长整数)
$redis->delete(‘key1′, ‘key2′);
$redis->delete(array(‘key3′, ‘key4′, ‘key5′));
ttl
得到一个key的生存时间
persist
移除生存时间到期的key
如果key到期 true 如果不到期 false
mset (redis版本1.1以上才可以用)
同时给多个key赋值
$redis->mset(array(‘key0′ => ‘value0′, ‘key1′ => ‘value1′));
multi, exec, discard
进入或者退出事务模式
参数可选Redis::MULTI或Redis::PIPELINE. 默认是 Redis::MULTI
Redis::MULTI:将多个操作当成一个事务执行
Redis::PIPELINE:让(多条)执行命令简单的,更加快速的发送给服务器,但是没有任何原子性的保证
discard:删除一个事务
返回值
multi(),返回一个redis对象,并进入multi-mode模式,一旦进入multi-mode模式,以后调用的所有方法都会返回相同的对象,只到exec()方法被调用。
watch, unwatch (代码测试后,不能达到所说的效果)
监测一个key的值是否被其它的程序更改。如果这个key在watch 和 exec (方法)间被修改,这个 MULTI/EXEC 事务的执行将失败(return false)
unwatch  取消被这个程序监测的所有key
参数,一对key的列表
$redis->watch(‘x’);
$ret = $redis->multi() ->incr(‘x’) ->exec();
subscribe *
方法回调。注意,该方法可能在未来里发生改变
publish *
发表内容到某一个通道。注意,该方法可能在未来里发生改变
exists
判断key是否存在。存在 true 不在 false
incr, incrBy
key中的值进行自增1,如果填写了第二个参数,者自增第二个参数所填的值
$redis->incr(‘key1′);
$redis->incrBy(‘key1′, 10);
decr, decrBy
做减法,使用方法同incr
getMultiple
传参
由key组成的数组
返回参数
如果key存在返回value,不存在返回false
$redis->set(‘key1′, ‘value1′); $redis->set(‘key2′, ‘value2′); $redis->set(‘key3′, ‘value3′); $redis->getMultiple(array(‘key1′, ‘key2′, ‘key3′));
$redis->lRem(‘key1′, ‘A’, 2);
$redis->lRange(‘key1′, 0, -1);
list相关操作
lPush
$redis->lPush(key, value);
在名称为key的list左边(头)添加一个值为value的 元素
rPush
$redis->rPush(key, value);
在名称为key的list右边(尾)添加一个值为value的 元素
lPushx/rPushx
$redis->lPushx(key, value);
在名称为key的list左边(头)/右边(尾)添加一个值为value的元素,如果value已经存在,则不添加
lPop/rPop
$redis->lPop(‘key’);
输出名称为key的list左(头)起/右(尾)起的第一个元素,删除该元素
blPop/brPop
$redis->blPop(‘key1′, ‘key2′, 10);
lpop命令的block版本。即当timeout为0时,若遇到名称为key i的list不存在或该list为空,则命令结束。如果timeout>0,则遇到上述情况时,等待timeout秒,如果问题没有解决,则对keyi+1开始的list执行pop操作
lSize
$redis->lSize(‘key’);
返回名称为key的list有多少个元素
lIndex, lGet
$redis->lGet(‘key’, 0);
返回名称为key的list中index位置的元素
lSet
$redis->lSet(‘key’, 0, ‘X’);
给名称为key的list中index位置的元素赋值为value
lRange, lGetRange
$redis->lRange(‘key1′, 0, -1);
返回名称为key的list中start至end之间的元素(end为 -1 ,返回所有)
lTrim, listTrim
$redis->lTrim(‘key’, start, end);
截取名称为key的list,保留start至end之间的元素
lRem, lRemove
$redis->lRem(‘key’, ‘A’, 2);
删除count个名称为key的list中值为value的元素。count为0,删除所有值为value的元素,count>0从头至尾删除count个值为value的元素,count<0从尾到头删除|count|个值为value的元素
lInsert
在名称为为key的list中,找到值为pivot 的value,并根据参数Redis::BEFORE | Redis::AFTER,来确定,newvalue 是放在 pivot 的前面,或者后面。如果key不存在,不会插入,如果 pivot不存在,return -1
$redis->delete(‘key1′); $redis->lInsert(‘key1′, Redis::AFTER, ‘A’, ‘X’); $redis->lPush(‘key1′, ‘A’); $redis->lPush(‘key1′, ‘B’); $redis->lPush(‘key1′, ‘C’); $redis->lInsert(‘key1′, Redis::BEFORE, ‘C’, ‘X’);
$redis->lRange(‘key1′, 0, -1);
$redis->lInsert(‘key1′, Redis::AFTER, ‘C’, ‘Y’);
$redis->lRange(‘key1′, 0, -1);
$redis->lInsert(‘key1′, Redis::AFTER, ‘W’, ‘value’);
rpoplpush
返回并删除名称为srckey的list的尾元素,并将该元素添加到名称为dstkey的list的头部
$redis->delete(‘x’, ‘y’);
$redis->lPush(‘x’, ‘abc’); $redis->lPush(‘x’, ‘def’); $redis->lPush(‘y’, ’123′); $redis->lPush(‘y’, ’456′); // move the last of x to the front of y. var_dump($redis->rpoplpush(‘x’, ‘y’));
var_dump($redis->lRange(‘x’, 0, -1));
var_dump($redis->lRange(‘y’, 0, -1));
string(3) “abc”
array(1) { [0]=> string(3) “def” }
array(3) { [0]=> string(3) “abc” [1]=> string(3) “456″ [2]=> string(3) “123″ }
SET操作相关
sAdd
向名称为key的set中添加元素value,如果value存在,不写入,return false
$redis->sAdd(key , value);
sRem, sRemove
删除名称为key的set中的元素value
$redis->sAdd(‘key1′ , ‘set1′);
$redis->sAdd(‘key1′ , ‘set2′);
$redis->sAdd(‘key1′ , ‘set3′);
$redis->sRem(‘key1′, ‘set2′);
sMove
将value元素从名称为srckey的集合移到名称为dstkey的集合
$redis->sMove(seckey, dstkey, value);
sIsMember, sContains
名称为key的集合中查找是否有value元素,有ture 没有 false
$redis->sIsMember(key, value);
sCard, sSize
返回名称为key的set的元素个数
sPop
随机返回并删除名称为key的set中一个元素
sRandMember
随机返回名称为key的set中一个元素,不删除
sInter
求交集
sInterStore
求交集并将交集保存到output的集合
$redis->sInterStore(‘output’, ‘key1′, ‘key2′, ‘key3′)
sUnion
求并集
$redis->sUnion(‘s0′, ‘s1′, ‘s2′);
s0,s1,s2 同时求并集
sUnionStore
求并集并将并集保存到output的集合
$redis->sUnionStore(‘output’, ‘key1′, ‘key2′, ‘key3′);
sDiff
求差集
sDiffStore
求差集并将差集保存到output的集合
sMembers, sGetMembers
返回名称为key的set的所有元素
sort
排序,分页等
参数
‘by’ => ‘some_pattern_*’,
‘limit’ => array(0, 1),
‘get’ => ‘some_other_pattern_*’ or an array of patterns,
‘sort’ => ‘asc’ or ‘desc’,
‘alpha’ => TRUE,
‘store’ => ‘external-key’
例子
$redis->delete(‘s’); $redis->sadd(‘s’, 5); $redis->sadd(‘s’, 4); $redis->sadd(‘s’, 2); $redis->sadd(‘s’, 1); $redis->sadd(‘s’, 3);
var_dump($redis->sort(‘s’)); // 1,2,3,4,5
var_dump($redis->sort(‘s’, array(‘sort’ => ‘desc’))); // 5,4,3,2,1
var_dump($redis->sort(‘s’, array(‘sort’ => ‘desc’, ‘store’ => ‘out’))); // (int)5
string命令
getSet
返回原来key中的值,并将value写入key
$redis->set(‘x’, ’42′);
$exValue = $redis->getSet(‘x’, ‘lol’); // return ’42′, replaces x by ‘lol’
$newValue = $redis->get(‘x’)’ // return ‘lol’
append
string,名称为key的string的值在后面加上value
$redis->set(‘key’, ‘value1′);
$redis->append(‘key’, ‘value2′);
$redis->get(‘key’);
getRange (方法不存在)
返回名称为key的string中start至end之间的字符
$redis->set(‘key’, ‘string value’);
$redis->getRange(‘key’, 0, 5);
$redis->getRange(‘key’, -5, -1);
setRange (方法不存在)
改变key的string中start至end之间的字符为value
$redis->set(‘key’, ‘Hello world’);
$redis->setRange(‘key’, 6, “redis”);
$redis->get(‘key’);
strlen
得到key的string的长度
$redis->strlen(‘key’);
getBit/setBit
返回2进制信息
zset(sorted set)操作相关
zAdd(key, score, member):向名称为key的zset中添加元素member,score用于排序。如果该元素已经存在,则根据score更新该元素的顺序。
$redis->zAdd(‘key’, 1, ‘val1′);
$redis->zAdd(‘key’, 0, ‘val0′);
$redis->zAdd(‘key’, 5, ‘val5′);
$redis->zRange(‘key’, 0, -1); // array(val0, val1, val5)
zRange(key, start, end,withscores):返回名称为key的zset(元素已按score从小到大排序)中的index从start到end的所有元素
$redis->zAdd(‘key1′, 0, ‘val0′);
$redis->zAdd(‘key1′, 2, ‘val2′);
$redis->zAdd(‘key1′, 10, ‘val10′);
$redis->zRange(‘key1′, 0, -1); // with scores $redis->zRange(‘key1′, 0, -1, true);
zDelete, zRem
zRem(key, member) :删除名称为key的zset中的元素member
$redis->zAdd(‘key’, 0, ‘val0′);
$redis->zAdd(‘key’, 2, ‘val2′);
$redis->zAdd(‘key’, 10, ‘val10′);
$redis->zDelete(‘key’, ‘val2′);
$redis->zRange(‘key’, 0, -1);
zRevRange(key, start, end,withscores):返回名称为key的zset(元素已按score从大到小排序)中的index从start到end的所有元素.withscores: 是否输出socre的值,默认false,不输出
$redis->zAdd(‘key’, 0, ‘val0′);
$redis->zAdd(‘key’, 2, ‘val2′);
$redis->zAdd(‘key’, 10, ‘val10′);
$redis->zRevRange(‘key’, 0, -1); // with scores $redis->zRevRange(‘key’, 0, -1, true);
zRangeByScore, zRevRangeByScore
$redis->zRangeByScore(key, star, end, array(withscores, limit ));
返回名称为key的zset中score >= star且score <= end的所有元素
zCount
$redis->zCount(key, star, end);
返回名称为key的zset中score >= star且score <= end的所有元素的个数
zRemRangeByScore, zDeleteRangeByScore
$redis->zRemRangeByScore(‘key’, star, end);
删除名称为key的zset中score >= star且score <= end的所有元素,返回删除个数
zSize, zCard
返回名称为key的zset的所有元素的个数
zScore
$redis->zScore(key, val2);
返回名称为key的zset中元素val2的score
zRank, zRevRank
$redis->zRevRank(key, val);
返回名称为key的zset(元素已按score从小到大排序)中val元素的rank(即index,从0开始),若没有val元素,返回“null”。zRevRank 是从大到小排序
zIncrBy
$redis->zIncrBy(‘key’, increment, ‘member’);
如果在名称为key的zset中已经存在元素member,则该元素的score增加increment;否则向集合中添加该元素,其score的值为increment
zUnion/zInter
参数
keyOutput
arrayZSetKeys
arrayWeights
aggregateFunction Either “SUM”, “MIN”, or “MAX”: defines the behaviour to use on duplicate entries during the zUnion.
对N个zset求并集和交集,并将最后的集合保存在dstkeyN中。对于集合中每一个元素的score,在进行AGGREGATE运算前,都要乘以对于的WEIGHT参数。如果没有提供WEIGHT,默认为1。默认的AGGREGATE是SUM,即结果集合中元素的score是所有集合对应元素进行SUM运算的值,而MIN和MAX是指,结果集合中元素的score是所有集合对应元素中最小值和最大值。
Hash操作
hSet
$redis->hSet(‘h’, ‘key1′, ‘hello’);
向名称为h的hash中添加元素key1—>hello
hGet
$redis->hGet(‘h’, ‘key1′);
返回名称为h的hash中key1对应的value(hello)
hLen
$redis->hLen(‘h’);
返回名称为h的hash中元素个数
hDel
$redis->hDel(‘h’, ‘key1′);
删除名称为h的hash中键为key1的域
hKeys
$redis->hKeys(‘h’);
返回名称为key的hash中所有键
hVals
$redis->hVals(‘h’)
返回名称为h的hash中所有键对应的value
hGetAll
$redis->hGetAll(‘h’);
返回名称为h的hash中所有的键(field)及其对应的value
hExists
$redis->hExists(‘h’, ‘a’);
名称为h的hash中是否存在键名字为a的域
hIncrBy
$redis->hIncrBy(‘h’, ‘x’, 2);
将名称为h的hash中x的value增加2
hMset
$redis->hMset(‘user:1′, array(‘name’ => ‘Joe’, ‘salary’ => 2000));
向名称为key的hash中批量添加元素
hMGet
$redis->hmGet(‘h’, array(‘field1′, ‘field2′));
返回名称为h的hash中field1,field2对应的value
redis 操作相关
flushDB
清空当前数据库
flushAll
清空所有数据库
randomKey
随机返回key空间的一个key
$key = $redis->randomKey();
select
选择一个数据库
move
转移一个key到另外一个数据库
$redis->select(0); // switch to DB 0
$redis->set(‘x’, ’42′); // write 42 to x
$redis->move(‘x’, 1); // move to DB 1
$redis->select(1); // switch to DB 1
$redis->get(‘x’); // will return 42
rename, renameKey
给key重命名
$redis->set(‘x’, ’42′);
$redis->rename(‘x’, ‘y’);
$redis->get(‘y’); // → 42
$redis->get(‘x’); // → `FALSE`
renameNx
与remane类似,但是,如果重新命名的名字已经存在,不会替换成功
setTimeout, expire
设定一个key的活动时间(s)
$redis->setTimeout(‘x’, 3);
expireAt
key存活到一个unix时间戳时间
$redis->expireAt(‘x’, time() + 3);
keys, getKeys
返回满足给定pattern的所有key
$keyWithUserPrefix = $redis->keys(‘user*’);
dbSize
查看现在数据库有多少key
$count = $redis->dbSize();
auth
密码认证
$redis->auth(‘foobared’);
bgrewriteaof
使用aof来进行数据库持久化
$redis->bgrewriteaof();
slaveof
选择从服务器
$redis->slaveof(’10.0.1.7′, 6379);
save
将数据同步保存到磁盘
bgsave
将数据异步保存到磁盘
lastSave
返回上次成功将数据保存到磁盘的Unix时戳
info
返回redis的版本信息等详情

[!--infotagslink--]

相关文章

  • java8如何用Stream查List对象某属性是否有重复

    这篇文章主要介绍了java8如何用Stream查List对象某属性是否有重复的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-11
  • R语言 如何删除指定变量或对象

    这篇文章主要介绍了R语言删除指定变量或对象的操作方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-05-06
  • 如何在Spring WebFlux的任何地方获取Request对象

    这篇文章主要介绍了如何在Spring WebFlux的任何地方获取Request对象,帮助大家更好的理解和使用springboot框架,感兴趣的朋友可以了解下...2021-01-26
  • JavaScript预解析,对象详解

    这篇文章主要介绍了JavaScript预解析,对象的的相关资料,小编觉得这篇文章写的还不错,需要的朋友可以参考下,希望能够给你带来帮助...2021-11-10
  • 牛叉的Jquery――Jquery与DOM对象的互相转换及DOM的三种操作

    只有jQuery对象才能调用jQuery类库的各种函数,同样有些dom对象的属性和方法在jQuery上也是无法调用的,不过基本上jQuery类库提供的函数包含了所有的dom操作。这就需要我们知道如何将jQuery对象和DOM的相互转换的方法。1...2015-10-30
  • js如何打印object对象

    js调试中经常会碰到输出的内容是对象而无法打印的时候,光靠alert只能打印出object标示,却不能打印出来里面的内容,甚是不方便,于是各方面整理总结了如下一个函数,能够将数组或者对象这类的结果一一打印出来,具体代码如下: fu...2015-10-21
  • javascript self对象使用详解

    这篇文章主要介绍了javascript self对象使用详解的相关资料,需要的朋友可以参考下...2016-10-20
  • 替换json对象中的key最佳方案

    本文给大家介绍如何替换json对象中的key,通过实例代码给大家介绍key的替换方法,代码也很简单,需要的朋友参考下吧...2021-06-02
  • ActiveX部件不能创建对象:dm.dmsoft代码:800A01AD

    vbs调用插件报:ActiveX部件不能创建对象,代码:800A01AD,一般是因为病毒导致dll文件丢失或者64系统问题导致,需要的朋友可以参考下...2020-06-30
  • 理解JavaScript事件对象

    这篇文章主要为大家介绍了JavaScript事件对象,了解JavaScript事件...2016-01-26
  • JS实现简单面向对象的颜色选择器实例

    这篇文章主要介绍了JS实现简单面向对象的颜色选择器,以完整实例形式分析了JavaScript基于面向对象实现颜色选择器的具体步骤与实现技巧,需要的朋友可以参考下...2016-04-23
  • 解决SpringCloud Feign传对象参数调用失败的问题

    这篇文章主要介绍了解决SpringCloud Feign传对象参数调用失败的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-06-24
  • 对象题目的一个坑 理解Javascript对象

    这篇文章主要介绍了Javascript对象,特别为大家分享了对象题目的一个坑,提供了解题思路,感兴趣的小伙伴们可以参考一下...2015-12-24
  • Xml中使用foreach遍历对象实现代码

    这篇文章主要介绍了Xml中使用foreach遍历对象实现代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-12-04
  • HTML5 FileReader对象的具体使用方法

    这篇文章主要介绍了HTML5 FileReader对象的具体使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-30
  • vue - props 声明数组和对象操作

    这篇文章主要介绍了vue - props 声明数组和对象操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-07-30
  • JavaScript Blob对象原理及用法详解

    这篇文章主要介绍了JavaScript Blob对象原理及用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-10-14
  • Bootstrap媒体对象的实现

    在web页面中,图片居左,内容居右排列,是非常常见的效果,它也就是媒体对象,它是一种抽象的样式,可以用来构建不同类型的组件。本文给大家介绍Bootstrap媒体对象的实现,感兴趣的朋友一起学习吧...2016-05-04
  • javascript创建对象的几种模式介绍

    下面小编就为大家带来一篇javascript创建对象的几种模式介绍。小编觉得挺不错的,现在分享给大家,也给大家做个参考...2016-05-09
  • 浅谈JS正则RegExp对象

    这篇文章主要介绍JS正则RegExp对象,正则表达式是描述字符模式的对象,用于对字符串模式匹配及检索替换,是对字符串执行模式匹配的强大工具。下面就来看具体详情,需要的朋友可以参考一下...2021-10-21