迭代器php
⑴ foreach和迭代器的区别 php
迭代器是一种更高级的工具。foreach是简单的循环语法。虽然功能上看起来相似。但迭代器是工具,这是二者性质上的不同,所以迭代器有更丰富的功能特性,还可以自定义具体的实现。特别是在内存占用上,迭代器是按需读取数据,foreach是一次性载入数据。PHP里面PDO,SimpleXML里面都有迭代器的具体实现,更完整的全部在SPL扩展部分。
⑵ php书籍推荐
关注PHP的人越来越多了,可惜国内PHP5方面的好书还非常少,几乎可以说没有。
PHP4即将是明日黄花,所以学PHP最好直接学PHP5。下面是我认为比较好的PHP5书籍:
1. Core PHP Programming, 3rd Edition
这本书是PHP专家Leon Atkinson和PHP创始人之一Zeev Suraski合着的。国内有
第2版,讲PHP4的,但这本第3版还买不到。学校图书馆有一本原版,可惜只有一本
(现在在我手里,咔咔)。讲得非常全面,做为Web编程方面的知识,几乎全部包括
了。最有价值的是Part 4,讲Software Enginerring的,介绍了设计、效率与调试,
还介绍了四种最常用的设计模式,非常有参考价值。可惜毕竟是03年的书,那时候
PHP5还在开发中,所以里面有一些内容并不完全适合现在的PHP5,比如名字空间(
PHP5并不支持名字空间)。不过瑕不掩瑜,做为PHP5的一本综合书籍,这本书非常
经典,可以用于入门,也可以用于提高。
2. PHP5 Power Programming
这本书是PHP的另一创始人Andi Gutmans写的,专门针对PHP5。个人感觉这本书
不适合学习,但很适合提高时参考。里面花了大量篇幅讲述PHP5的面向对象机制,
不过基本上跟Core PHP Programming重复,所以看过Core后再看这些将很快,可以
当成温故一遍。还有一章介绍了PHP5里的高级面向对象特性,如迭代器,反射API(
Reflection API,在其它面向对象语言里称自省),也介绍了设计模式。
可惜的是,跟上面一本书一样,都是只讲PHP特性的书,具体到PHP高级应用的
实战讲得感觉比较欠缺,像MVC模式,两本书都没讲到,而这些对PHP高级编程来说是
非常重要的。比较令人安慰的是这本书还介绍了很多PHP高级特性,像PEAR包,APC,
APD,Xdebug,还有Zend Studio的使用,等等,这些还是非常有价值的。
总之,这是一本很适合提高时使用的书籍,跟Core一样,也是PHP书籍中的经典。
3. PHP and Mysql Web Development, 3rd Edition
这是国内唯一能买到的PHP5书籍,中文翻译,但翻译质量不怎么样,有些句子
读起来莫名其妙。这本书比较适合初中级的PHP学习,而且非常实际,有很多基本应
用的实例,很适合入门。除了数据库知识很不错外,里面也讲到了使用PHP和MySQL
开发中等项目时所需要考虑到的问题,介绍了很多基本的软件项目管理方法,非常
实用。后面几章是一些实例,介绍了购物车(我最不喜欢这东西),邮件列表,内容
管理系统和论坛的编写,不过都只是基础,没有高级技巧,所以看起来会觉得很不舒
服,呵呵。
里面有一张泛泛地讲到了电子商务安全,可以参考下。个人感觉相当不错的内容
是MySQL部分,基本涵盖了数据库基础和MySQL基础及高级特性,但限于篇幅,没有去
讲得很深入,权当是入门指引了。
因为是国内能买到的,所以很多人可能会喜欢从这本书开始学PHP5,我觉得也不
错。总之很推荐这本书。
4. Essential PHP Security
这是一本讲述PHP编码安全的书,非常需要引起PHP开发人员的重视。我觉得这是
一本必读书籍,读过后会让你冒冷汗。现在注重安全编码的人实在太少了,对于一个
专业的PHP程序员,PHP安全特性绝对要烂熟于胸,而这本书就提供了一个非常好的视
角。
5. PHP Architect's Guide to PHP Design Patterns
这本书我正在看,对于PHP5面向对象的学习绝对非常有帮助。里面介绍了非常多
的设计模式,直接以PHP语言实现出来,可以让你一步到位使用模式思想。第17章介
绍了PHP里的MVC模式,可以说是带了个好头,很有参考价值。
由于还没看完,所以不敢多评价,但可以肯定的是,这本书对于学PHP5面向对象
高级编程的人来说是绝对必备的。
国内有中文版,phpchina社区翻译的,可以下载过来参考下。另外,好像关于
PHP设计模式的书又出了一本,叫做《PHP5: Objects, Patterns and Practice》,
可惜我Google了半天也找不到下载地址,只能作罢了,希望以后能找到。可以肯定这
又将是一本让人振奋的书。
又将是一本让人振奋的书。
最后想说明的是,Oreilly的PHP书就不用看了,包括PHP创始人Rasmus Lerdorf写的
《Programming PHP》(现在好像出第2版了),讲得东西基本上全是PHP手册里的东
西,没必要重复浪费时间。像《Learning PHP5》,《PHP Cookbook》之类,说实话
我个人感觉真的只是PHP手册的子集。最近好像又出了本同样可以看成是子集的书,
书名是《Learning PHP and MySQL》,看了一眼就没看了。不是对Oreilly有偏见,
只是因为它的书全是入门级的,没什么含金量,属于看过就扔的那种。想想K&R的
《The C Programming Language》吧,呵呵。
最最后想说明的是,PHP手册,一定要反复看!这个是学PHP最重要的参考资料,每个
人都应该有一本以备不时之需。有中文翻译版的,不过里面的链接有错误,看起来不
是很方便,但多摸索几次就能把链接弄对了。
大概就讲这些了,只是我个人观点,希望大家指点批评,共同进步。
⑶ PHP的SPL标准库的用法介绍
本文介绍下,php编程中SPL中的用法,SPL,PHP 标准库(Standard PHP Library) ,此从 PHP 5.0 起内置的组件和接口,有需要的朋友参考下。
PHP SPL的用法
SPL,PHP 标准库(Standard PHP Library) ,此从 PHP 5.0 起内置的组件和接口,并且从 PHP5.3 已逐渐的成熟。SPL 其实在所有的 PHP5 开发环境中被内置,同时无需任何设置。
似乎众多的 PHP 开发人员基本没有使用它,甚至闻所未闻。究其原因,可以追述到它那阳春白雪般的说明文档,使你忽略了“它的存在”。SPL 这块宝石犹如铁达尼的“海洋之心”般,被沉入海底。而现在它应该被我们捞起,并将它穿戴在应有的位置 ,而这也是这篇文章所要表述的观点。
SPL 提供了什么?
SPL 对 PHP 引擎进行了扩展,例如 ArrayAccess、Countable 和 SeekableIterator 等接口,它们用于以数组形式操作对象。同时,你还可以使用 RecursiveIterator、ArrayObejcts 等其他迭代器进行数据的迭代操作。
它还内置几个的对象例如 Exceptions、SplObserver、Spltorage 以及 splautoloadregister、splclasses、iteratorapply 等的帮助函数(helper functions),用于重载对应的功能。
这些工具聚合在一起就好比是把多功能的瑞士军刀,善用它们可以从质上提升 PHP 的代码效率。那么,如何发挥它的威力?
重载 autoloader
如果你是位“教科书式的程序员”,那么你保证了解如何使用 __autoload 去代替 includes/requires 操作惰性载入对应的类,对不?
但久之,你会发现你已经陷入了困境,首先是你要保证你的类文件必须在指定的文件路径中,例如在 Zend 框架中你必须使用“_”来分割类、方法名称(你如何解决这一问题?)。
另外的问题:
当项目变得越来越复杂, __autoload 内的逻辑也会变得相应的`复杂。到最后,甚至你会加入异常判断,以及将所有的载入类的逻辑如数写到其中。
大家都知道“鸡蛋不能放到一个篮子中”,利用 SPL 可以分离 __autoload 的载入逻辑。只需要写个你自己的 autoload 函数,然后利用 SPL 提供的函数重载它。
例如,上述 Zend 框架的问题,你可以重载 Zend loader 对应的方法,如果它没有找到对应的类,那么就使用先前定义的函数。
复制代码 代码示例:
<?php
class MyLoader {
public static function doAutoload($class) {
// 本模块对应的 autoload 操作
}
}
spl_autoload_register( array('MyLoader', 'doAutoload') );
?>
spl autoload register 还能以数组的形式加入多个载入逻辑。同时,你还可以利用spl autoload unregister 移除已经不再需要的载入逻辑,这功能总会用到的。
迭代器
迭代是常见设计模式之一,普遍应用于一组数据中的统一的遍历操作。可以毫不夸张的说,SPL 提供了所有你需要的对应数据类型的迭代器。
有个非常好的案例就是遍历目录。常规的做法就是使用 scandir ,然后跳过“.“ 和 “..”,以及其它未满足条件的文件。例如你需要遍历个某个目录抽取其中的图片文件,就需要判断是否是 jpg、gif 结尾。
使用 SPL 的迭代器执行上述递归寻找指定目录中的图片文件的例子:
复制代码 代码示例:
<?php
class RecursiveFileFilterIterator extends FilterIterator {
// 满足条件的扩展名
protected $ext = array('jpg','gif');
/**
* 提供 $path 并生成对应的目录迭代器
*/
public function __construct($path) {
parent::__construct(new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path)));
}
/**
* 检查文件扩展名是否满足条件
* // www.jbxue.com
*/
public function accept() {
$item = $this->getInnerIterator();
if ($item->isFile() &&
in_array(pathinfo($item->getFilename(), PATHINFO_EXTENSION), $this->ext)) {
return TRUE;
}
}
}
// 实例化
foreach (new RecursiveFileFilterIterator('/path/to/something') as $item) {
echo $item . PHP_EOL;
}
?>
⑷ php怎么写出全国的城市地区
require'city.php';
//连接数据库(PDO)
$pdo=newPDO('mysql:host=localhost;dbname=city','root','root');
$pdo->exec('setnamesutf8');
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE,PDO::FETCH_ASSOC);
//实例化城市类
$c=newcity();
$result=$c->mycity();
$city_id=0;
foreach($resultas$k=>$value){
if(count($value)==count($value,1)){
$sql="insertintocity_province(province)value('{$value['province_name']}')";
$smt=$pdo->prepare($sql);
$smt->execute();
}else{
$sql11="insertintocity_province(province)value('{$value['province_name']}')";
$smt11=$pdo->prepare($sql11);
$smt11->execute();
foreach($value['city']as$v=>$value1){
$sql2="insertintocity_name(name,province_id)values('{$value1['city_name']}','{$k}')";
$smt2=$pdo->prepare($sql2);
$smt2->execute();
$city_id+=1;
echo$city_id.'<br>';
if(!empty($value1['area'])){
foreach($value1['area']as$valu1e2){
$sql3="insertintocity_area(area,city_id)values('{$valu1e2}','{$city_id}')";
$smt3=$pdo->prepare($sql3);
$smt3->execute();
}
}
}
}
}
城市类太大了,发不了。
我是把省、市、地区分别存在三个数据表中(我是新手,刚自己写的)
⑸ php迭代器iterator怎么用
使用foreach 与使用迭代器,并不冲突
迭代器可以使用在:
1、使用返回迭代器的包或库时(如PHP5中的SPL迭代器)
2、无法在一次的调用获取容器的所有元素时
3、要处理数量巨大的无素时(数据库中的表以GB计的数据)
迭代器还可以用来构造一些数据结构。
你可以去后盾人平台看看,里面的东西不错
⑹ PHP7.4.9版本正式更新,你知道了吗
PHP 7.4.9 版本现已发布,具体更新内容如下:
Apache:修复了错误
#79030
(升级 apache2handler 的 php_apache_sapi_get_request_time 以返回 usec)。COM:修复了错误
#63208
(BSTR 到 PHP字 符串转换不是 binary safe)。修复了错误
#63527
(DCOM 无法使用用户名、密码参数。)。Core :修复了错误
#79740
(不能静态调用 serialize() 和 unserialize() methods)。修复了错误
#79783
(php_str_replace_common 中的段错误)。修复了错误
#79778
(如果转储带有未解决的静态变量的闭包,则断言失败)。修复了错误
#79779
(通过引用分配字符串偏移量的属性时断言失败)。修复了错误
#79792
(如果销毁了空数组,则不会删除 HT 迭代器)。修复了错误
#78598
(在 undef index RW error segfaults 期间更改数组)。修复了错误
#79784
(如果在数组写获取期间的 undef var 期间更改数组,则在 free 后使用)。修复了错误
#79793
(如果更改了未定义索引警告中使用的字符串,则 free 后使用)。修复了错误
#79862
(子级中的公共非静态属性应优先于私有静态)。修复了错误
#79877
(getimagesize 函数在一个空字节后 silently truncates)(cmb)Fileinfo:修复了错误
#79756
(finfo_file 崩溃(FILEINFO_MIME))。ftp:修复了错误
#55857
(大文件上的 ftp_size)。Mbstring:修复了错误
#79787
(mb_strimwidth 不会修剪字符串)。Phar:修复了错误
#79797
(在 phar_parse_zipfile 函数中使用 freed hash key)。(CVE-2020-7068)Reflection:修复了错误
#79487
(::getStaticProperties() 忽略属性修改)。修复了错误
#69804
(::getStaticPropertyValue() throws on protected props)。修复了错误
#79820
(当复制到 ReflectionProperty 的类型被解析时,在 free 之后使用)。Standard:修复了错误
#70362
(Can't () large 'data://' with open_basedir)。修复了错误
#78008
(dns_check_record() 在 Alpine 上始终返回 true)。修复了错误
#79839
(array_walk() 不 respect 属性类型)。
⑺ 请问怎么用PHP生成全国各省市的随时地址
一般这样的都是存在数据库中,数据库3个字段 id pid name ,分别是 id 上级id 名称
用数组,三维数组
比如
id pid name
1 0 广东省
2 1 广州市
3 2 花都区
然后PHP读取库,用一个迭代器,理论上可以取出无限级分类