同步操作将从 Paul/PHP_SPL 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
SPL的常用数据结构以及常用迭代器等,主要是参考慕课网的《站在巨人的肩膀上写代码-SPL》教程
数据建模/数据结构
元素遍历
常用方法的统一调用:
类定义的自动装载
双向链表、堆栈、队列、堆、降序堆、升序堆、优先级队列、定长数组、对象容器
如图:
比如:
具体见2_4_SplDoublyLinkedList.php
如图:
具体见2_7_SplStack.php
队列正好和堆栈相反,最先进入队列的元素会最先走出队列
队列继承自SplDoublyLinkedList类的SplQueue类
操作:
代码见:2_8_SplQueue.php
什么是迭代器:通过某种统一的方式遍历链表或者数组中的元素的过程叫做遍历,而这种统一的遍历工具叫做迭代器
PHP中的迭代器是通过Iterator接口去定义的,Iterator的操作方法有:
ArrayInterator迭代器:用于遍历数组
如果要来遍历数组的话,传统的方法是用foreach即可
$fruits = [
'apple' => 'apple value',
'orange' => 'orange value',
'grape' => 'grape value',
'plum' => 'plum value'
];
// 使用传统的foreach遍历数组
echo "使用传统的foreach遍历数组:" . PHP_EOL;
foreach ($fruits as $key => $value) {
echo $key . " : " . $value . PHP_EOL;
}
也可以使用ArrayInterator迭代器来遍历数组:
$fruits = [
'apple' => 'apple value',
'orange' => 'orange value',
'grape' => 'grape value',
'plum' => 'plum value'
];
// 实例化ArrayIterator
$obj = new ArrayObject($fruits);
$it = $obj->getIterator();
// 使用ArrayIterator来遍历数组(foreach)
echo PHP_EOL . "使用ArrayIterator来遍历数组(foreach):" . PHP_EOL;
foreach ($it as $key => $value) {
echo $key . " : " . $value . PHP_EOL;
}
// 使用ArrayIterator来遍历数组(while)
echo PHP_EOL . "使用ArrayIterator来遍历数组(while):" . PHP_EOL;
$it->rewind();
while ($it->valid()) {
echo $it->key() . " : " . $it->current() . PHP_EOL;
$it->next();
}
// 跳过某些元素进行打印
echo PHP_EOL . "使用ArrayIterator来遍历数组(跳过某些元素):" . PHP_EOL;
$it->rewind();
if ($it->valid()) {
$it->seek(2); // 设置指针的位置,为n时即跳过前面n-1的元素
while ($it->valid()) {
echo $it->key() . " : " . $it->current() . PHP_EOL;
$it->next();
}
}
/*
grape : grape value
plum : plum value
*/
// 对key进行字典序排序
echo PHP_EOL . "使用ArrayIterator来遍历数组(对key排序):" . PHP_EOL;
$it->ksort();
$it->rewind();
while ($it->valid()) {
echo $it->key() . " : " . $it->current() . PHP_EOL;
$it->next();
}
/*
apple : apple value
grape : grape value
orange : orange value
plum : plum value
*/
// 对value进行字典序排序
echo PHP_EOL . "使用ArrayIterator来遍历数组(对value排序):" . PHP_EOL;
$it->asort();
$it->rewind();
while ($it->valid()) {
echo $it->key() . " : " . $it->current() . PHP_EOL;
$it->next();
}
/*
apple : apple value
grape : grape value
orange : orange value
plum : plum value
*/
完整的代码见:3_2_ArrayIterator.php
PHP的简单的数组代码例子,见3_2_Array.php
AppendIterator迭代器:陆续遍历几个迭代器
AppendIterator迭代器可以通过append方法把多个ArrayIterator迭代器对象放到一起来遍历
代码见:3_3_Appendlterator.php
MultipleIterator迭代器用于把多个Iterator里面的数据组合成为一个整体来访问
MultipleIterator迭代器可以按数字作为数组的key,代码见:3_4_MultipleIterator_1.php
也可以按字符串作为数组的key,代码见3_4_MultipleIterator_2.php
Filesystemlterator迭代器用于遍历文件系统
代码见3_5_Filesystemlterator.php
count()方法是对象继承Countable后必须实现的方法,即某个类继承Countable,类中必须定义count方法。这样的话,直接使用count方法时会调用对象自身的count方法。
代码见4_2_Countable.php
OuterIterator接口:可以对迭代器进行一定的处理后返回
IteratorIterator类是OuterIterator接口的实现,扩展的时候可以直接继承IteratorIterator类。
代码见4_3_OuterIterator.php
Recursivelterator接口:可以对多层结构的迭代器进行迭代,比如说遍历一棵树。所有具有层次结构特点的数据都可以用这个接口遍历,比如说文件夹。
关键方法:
Seekablelterator可以通过seek方法定位到集合里面的某个特定元素
seek方法:参数是元素的位置,从0开始计算(在3_2_ArrayIterator.php有使用)
SPL中实现该接口的类: ArrayIterator、DirectoryIterator、FilesystemIterator、GlobIterator、RecursiveArrayIterator、RecursiveDirectoryIterator
Autoload:为了初始化PHP中的对象,需要通过一定的方法定位到类的定义。通常情况下,类会定义在一个单独的文件中。Autoload就是找到这些类文件的方法,即类自动加载函数
先在当前目录定义一个新的目录,命名为:5_1_Class,里面放入两个php,内容都为:
<?php
class Test
{
public function __construct()
{
echo "加载Test.class.php的Test Class,这是初始化";
}
}
稍微echo的内容不一样,其他的都是一样的,都是Test方法,两个php一个命名为Test.php,另一个是Test.class.php。如图:
然后目录外定义一个PHP(5_1_autoload_register.php),来演示自动装载类:
<?php
/**
* spl_autoload_register函数
* 类自动加载函数
*/
// 注册并返回spl_autoload函数使用的默认文件扩展名,可以有多个,先找第一个,如没有才找接下来的后缀
spl_autoload_extensions('.php, .class.php');
// 加载类的路径
set_include_path(get_include_path() . PATH_SEPARATOR . "5_1_Class/");
// 让类的自动加载生效
spl_autoload_register();
// 调用自动加载的类
new Test();
运行: 加载Test.php的Test,这是初始化
如果代码改成:
spl_autoload_extensions('.class.php, .php');
那么就会输出: 加载Test.class.php的Test Class,这是初始化
除了上面的使用spl_autoload_register来实现自动装载类,还可以使用__autoload函数来装载类
5_2_autoload_1.php:
<?php
/**
* autoload装载类
*/
/**
* 定义__autoload函数,可以自动完成类的装载
* @param $class_name
*/
function __autoload($class_name)
{
echo "__autoload class:" . $class_name . PHP_EOL;
// 装载类
require_once('5_1_Class/' . $class_name . ".php");
}
new Test();
/**
__autoload class:Test
加载Test.php的Test,这是初始化
*/
比如:
5_2_autoload_2.php:
<?php
/**
* 如果spl_autoload_register函数和__autoload函数同时存在的时候,原来的 __autoload()方法将不会再调用
*/
/**
* 定义__autoload函数,可以自动完成类的装载
* @param $class_name
*/
function __autoload($class_name)
{
echo "__autoload class:" . $class_name . PHP_EOL;
// 装载类
require_once('5_1_Class/' . $class_name . ".php");
}
/**
* 定义一个用来替换__autoload函数的类文件装载函数
* 需要使用spl_autoload_register('classLoader')来实现自动装载
* @param $class_name
*/
function classLoader($class_name)
{
echo "classLoader() load class:" . $class_name . PHP_EOL;
// 装载类
require_once('5_1_Class/' . $class_name . ".php");
}
// 传入定义好的类文件装载函数来实现自动装载
spl_autoload_register('classLoader');
new Test();
/*
classLoader() load class:Test
加载Test.php的Test,这是初始化
*/
上面的例子是通过require_once函数来载入类文件,如果我们不想通过require或者是require_once来载入类文件时,而是想通过系统自动查找文件名来装载类的时候,必须显式调用spl_autoload函数,参数为类的名称来重启类文件的自动查找(装载),另外,当使用 spl_autoload函数的时候,require函数会失去作用了
代码见:5_3_splautoload.php
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。