对于MySQL应该也不是很陌生吧,我常常爱犯的以错误就是执行mysli_qurey()后就使用数据,忘记返回的是结果集了。而对于lSELECT,、SHOW, DESCRIBEEXPLAINmysql_query返回的是mysqli_result object,也就是结果集对象;对于其他的mysql_query返回bool值,我在想为啥一个对象可以遍历呢,查看:

mysqli_result implements Traversable {
/* Properties */
int $current_field ;
int $field_count;
array $lengths;
int $num_rows;
/* Methods */
bool data_seek ( int $offset )
mixed fetch_all ([ int $resulttype = MYSQLI_NUM ] )
mixed fetch_array ([ int $resulttype = MYSQLI_BOTH ] )
array fetch_assoc ( void )
object fetch_field_direct ( int $fieldnr )
object fetch_field ( void )
array fetch_fields ( void )
object fetch_object ([ string $class_name = "stdClass" [, array $params ]] )
mixed fetch_row ( void )
bool field_seek ( int $fieldnr )
void free ( void )
}

mysqli_result是实现Traversable接口,手册是这样说的:

Iterator support was added, as mysqli_result now implements Traversable.
//因为mysqli现在实现了Traversable ,因此迭代被支持

所以查询返回的结果集对象能被遍历。

Traverseable介绍

这个接口没有任何方法,检测一个类是否可以使用 foreach 进行遍历的接口。他是Iterator的父接口,所以实现iterator的方法的类可以进行迭代。最底层的,这个接口一般不会去实现它。

任何需要实现Traversable接口的用户自定义类都必须通过实现从Traversable接口派生的用户自定义接口来做到这一点, IteratorAggregateIterator 即是它派生的接口。

if((new B()) instanceof  Traversable){
foreach () ...
}
IteratorAggregate介绍

IteratorAggregate接口(是用来将Iterator接口要求实现的5个方法委托给其他类(比如ArrayIterator)来实现)。这让你可以在类的外部实现迭代功能.并允许重新使用常用的迭代器方法,而不是在编写的每个可迭代类中重复使用这些方法。

IteratorAggregate extends Traversable { 

    //实现该方法时,必须返回一个实现了Iterator接口的类的实例 

    abstract public Traversable getIterator ( void )
}

其中getIterator 方法返回值必须是能遍历或实现Iterator接口(must be traversable or implement interface Iterator)。SPL还提供了一些专门用来与IteratorAggregate接口一起使用的内置迭代器。使用这些迭代器意味着只需要实现一个方法并实例化一个类就可以使对象可以迭代访问了。

class myData implements \IteratorAggregate {
public $property1 = "Public property one";
public $property2 = "Public property two";
public $property3 = array([1,23,4],4,5); public function __construct() {
$this->property4 = "last property";
}
//实现这个方法
public function getIterator() {
return new ArrayIterator($this);
}
} $obj = new myData; foreach($obj as $key => $value) {
var_dump($key, $value);
echo "\n";
}

来说说相关的接口吧

ArrayAccess

使一个对象可以当数组用,数组式访问接口(我试了遍历它不行)。

class ImplementArrayAccess implements ArrayAccess
{
private $container = array(); public function __construct()
{
$this->container = array(
"one" => 1,
"two" => 2,
"three" => 3,
);
} public function offsetSet($offset, $value)
{
if (is_null($offset)) {
$this->container[] = $value;
} else {
$this->container[$offset] = $value;
}
} public function offsetExists($offset)
{
return isset($this->container[$offset]);
} public function offsetUnset($offset)
{
unset($this->container[$offset]);
} public function offsetGet($offset)
{
return isset($this->container[$offset]) ? $this->container[$offset] : null;
}
}
$datas = new ImplementArrayAccess();
$datas['four'] = 4;
unset($datas['three']);
print_r($datas);

结果

ImplementArrayAccess Object
(
[container:ImplementArrayAccess:private] => Array
(
[one] => 1
[two] => 2
[four] => 4
) )

ArrayIterator

这个迭代器允许在遍历数组和对象时删除和更新值与键

定义的接口:

ArrayIterator implements ArrayAccess , SeekableIterator , Countable , Serializable {
/* 方法 */
public void append ( mixed $value )
public void asort ( void )
public __construct ([ mixed $array = array() [, int $flags = 0 ]] )
public int count ( void )
public mixed current ( void )
public array getArrayCopy ( void )
public void getFlags ( void )
public mixed key ( void )
public void ksort ( void )
public void natcasesort ( void )
public void natsort ( void )
public void next ( void )
public void offsetExists ( string $index )
public mixed offsetGet ( string $index )
public void offsetSet ( string $index , string $newval )
public void offsetUnset ( string $index )
public void rewind ( void )
public void seek ( int $position )
public string serialize ( void )
public void setFlags ( string $flags )
public void uasort ( string $cmp_function )
public void uksort ( string $cmp_function )
public string unserialize ( string $serialized )
public bool valid ( void )
}

例子:

$fruits = array(
"apple" => "yummy",
"orange" => "ah ya, nice",
"grape" => "wow, I love it!",
"plum" => "nah, not me"
);
$obj = new ArrayIterator( $fruits );
var_dump($obj); foreach ($obj as $item){
echo $item;
}

ArrayObject

也是让对象可以当着数组来使用

接口

ArrayObject implements IteratorAggregate , ArrayAccess , Serializable , Countable {
/* 常量 */
const integer STD_PROP_LIST = 1 ;
const integer ARRAY_AS_PROPS = 2 ;
/* 方法 */
public __construct ([ mixed $input = [] [, int $flags = 0 [, string $iterator_class = "ArrayIterator" ]]] )
public void append ( mixed $value )
public void asort ( void )
public int count ( void )
public array exchangeArray ( mixed $input )
public array getArrayCopy ( void )
public int getFlags ( void )
public ArrayIterator getIterator ( void )
public string getIteratorClass ( void )
public void ksort ( void )
public void natcasesort ( void )
public void natsort ( void )
public bool offsetExists ( mixed $index )
public mixed offsetGet ( mixed $index )
public void offsetSet ( mixed $index , mixed $newval )
public void offsetUnset ( mixed $index )
public string serialize ( void )
public void setFlags ( int $flags )
public void setIteratorClass ( string $iterator_class )
public void uasort ( callable $cmp_function )
public void uksort ( callable $cmp_function )
public void unserialize ( string $serialized )
}

看着似乎ArrayObject与ArrayIterator功能相似,但他们继承的接口不同,

Mysql中结果集(mysql_result)与Traversable的更多相关文章

  1. 基于Galera Cluster多主结构的Mysql高可用集群

    Galera Cluster特点 1.多主架构:真正的多点读写的集群,在任何时候读写数据,都是最新的 2.同步复制:集群不同节点之间数据同步,没有延迟,在数据库挂掉之后,数据不会丢失 3.并发复制:从 ...

  2. 使用DBOutputFormat把MapReduce产生的结果集导入到mysql中

    数据在HDFS和关系型数据库之间的迁移,主要有以下两种方式 1.按照数据库要求的文件格式生成文件,然后由数据库提供的导入工具进行导入 2.采用JDBC的方式进行导入 MapReduce默认提供了DBI ...

  3. HAProxy+keepalived+MySQL 实现MHA中slave集群负载均衡的高可用

    HAProxy+keepalived+MySQL实现MHA中slave集群的负载均衡的高可用 Ip地址划分: 240    mysql_b2 242    mysql_b1 247    haprox ...

  4. Mysql中各种与字符编码集(character_set)有关的变量含义

    mysql涉及到各种字符集,在此做一个总结. 字符集的设置是通过环境变量来设置的,环境变量和linux中的环境变量是一个意思.mysql的环境变量分为两种:session和global.session ...

  5. 浅析MySQL中exists与in的使用

    exists对外表用loop逐条查询,每次查询都会查看exists的条件语句,当 exists里的条件语句能够返回记录行时(无论记录行是的多少,只要能返回),条件就为真,返回当前loop到的这条记录, ...

  6. MySQL中如何查看“慢查询”,如何分析执行SQL的效率?

    一.MySQL数据库有几个配置选项可以帮助我们及时捕获低效SQL语句 1,slow_query_log这个参数设置为ON,可以捕获执行时间超过一定数值的SQL语句. 2,long_query_time ...

  7. MySQL中的information_schema数据库详解

    information_schema数据库是MySQL自带的,它提供了访问数据库元数据的方式.什么是元数据呢?元数据是关于数据的数据,如数据库名或表名,列的数据类型,或访问权限等.有些时候用于表述该信 ...

  8. MySQL(五) MySQL中的索引详讲

    序言 之前写到MySQL对表的增删改查(查询最为重要)后,就感觉MySQL就差不多学完了,没有想继续学下去的心态了,原因可能是由于别人的影响,觉得对于MySQL来说,知道了一些复杂的查询,就够了,但是 ...

  9. Mysql中mysqldump命令使用详解

    MySQL有很多可以导入数据的方法,然而这些只是数据传输中的一半,另外的一般是从MySQL数据库中导出数据.有许多的原因我们需要导出数据.一个重要的原因是用于备份数据库.数据的造价常常是昂贵的,需要谨 ...

随机推荐

  1. beego的配置文件记录

    摘自https://github.com/beego/tutorial/blob/master/zh/3/params.slide * beego的默认参数 - AppName 应用名称,默认是 be ...

  2. Server Tomcat v9.0 Server at localhost failed to start.

    最近老是出现这样的问题,在网上找了很多方法都不行,试着把Tomcat重新配置了一下就好了,事后找到一个博客,试了一下也可以使用

  3. Django 的路由分配系统

    Django的路由系统 URL配置(URL.conf)就像Django所支撑网站的目录,它的本质是URL与要为该URL调用的视图函数之间的映射表. 我们就是以这种方式告诉Django,遇到哪个URL的 ...

  4. java代码=====实现修改while()

    总结: package com.mmm; public class cse { public static void main(String[] args) { // int count=0;你妹,我 ...

  5. Linux文件属性,类型,ls -lhi解释行列

    Linux文件属性(描述信息) -i inode节点号 -h 人类可读 ls -lhi 1703938 drwxr-xr-x 2 rsync rsync 4.0K Jun 7 07:24 gamese ...

  6. 第十一章 Helm-kubernetes的包管理器(中)

    11.5 chart详解 chart由一系列文件组成,这些文件描述了K8s部署应用时需要的资源,比如Servcie.Deployment.PersistentVolmeClaim.Secret.Con ...

  7. Mac Terminal终端光标的快捷键操作

    2016年08月18日 18:26:06 阅读数:4217 Mac Terminal终端和linux上终端光标的快捷键操作是一样的,都是来自Emacs这个神级的编辑器,由于我以前vim用的多,没怎么用 ...

  8. B. T-primes

    /* PROBLEMSSUBMITSTATUSSTANDINGSCUSTOM TEST B. T-primes time limit per test2 seconds memory limit pe ...

  9. 重置mysql的root用户密码

    /etc/rc.d/init.d/mysql status /etc/rc.d/init.d/mysql stop mysqld_safe --skip-grant-tables& mysql ...

  10. linux 利用nethogs查看某进程的网卡流量

    一.nethogs介绍 分享一个linux 下检测系统进程占用带宽情况的检查.来自github上的开源工具. 它不依赖内核中的模块.当我们的服务器网络异常时,可以通过运行nethogs程序来检测是那个 ...