我们可以通过PHP获取目录中的文件
$files = new DirectoryIterator() 
Run Code Online (Sandbox Code Playgroud)
之后是否有一种简单的方法来按特定顺序对项目进行排序以显示它们?谢谢.
尽我所能我无法理解IteratorIterator类实际上做的事情.我知道类可以实现Traversable,所以引擎知道它可以使用foreach循环,我意识到IteratorIterator应该将Traversable中的任何东西转换为Iterator,但我不能在生活中理解如何.
以PDOStatement类为例; 如何实现标准迭代器方法(下一步,密钥,倒带等)以允许迭代PDOStatement?
对不起,如果我的问题不清楚,我只是在努力掌握这个课程的确切原因,而且关于它的文档很少.
谢谢,
将
更新:通过phpt文件,我发现一个使用IteratorIterator的测试:
<?php
$root = simplexml_load_string('<?xml version="1.0"?>
<root>
    <child>Hello</child>
    <child>World</child>
</root>
');
foreach (new IteratorIterator($root->child) as $child) {
    echo $child."\n";
}
?>
Run Code Online (Sandbox Code Playgroud)
预期的产出是:
Hello
World
Run Code Online (Sandbox Code Playgroud)
我并没有真正遵循IteratorIterator构造如何将$ root-> child作为参数以及它如何设法迭代子元素.
有没有办法从PHP中的SPL自动加载器中抛出异常,以防它失败?它似乎不适用于PHP 5.2.11.
class SPLAutoLoader{
    public static function autoloadDomain($className) {
        if(file_exists('test/'.$className.'.class.php')){
            require_once('test/'.$className.'.class.php');
            return true;
        }       
        throw new Exception('File not found');
    }
} //end class
//start
spl_autoload_register( array('SPLAutoLoader', 'autoloadDomain') );
try{
    $domain = new foobarDomain();
}catch(Exception $c){
    echo 'File not found';
}
Run Code Online (Sandbox Code Playgroud)
当调用上面的代码时,没有异常的迹象,而是我得到一个标准的"致命错误:类'foobarDomain'在bla中找不到".并且脚本的执行终止.
在我在服务器端的include_path中,我在'/ usr/share/pear /'中引用了一个pear目录.在我的应用程序中,我包含来自公共库的文件,位于'/ usr/share/pear/library /'中require_once 'library/file.php'.
我最近开始使用spl自动加载器,我注意到在加载器函数中你必须确定包含文件的逻辑.我这样做的第一种方法是尝试包含一个文件并用它@来抑制它以查看它是否会失败,例如,@include 'library/file.php'我认为主要是因为我读了很多关于@不良做法的事情我决定通过爆炸get_include_path来自己手动完成工作.PATH_SEPARATOR并查看目录是否是我想要的目录,然后执行file_exists并包含它.
像这样:
function classLoader( $class ) {
    $paths = explode( PATH_SEPARATOR, get_include_path() );
    $file = SITE_PATH . 'classes' . DS . $class . '.Class.php';
    if ( file_exists( $file) == false ) 
    {
        $exists = false;
        foreach ( $paths as $path ) 
        {
            $tmp = $path . DS . 'library' . DS . 'classes' . DS . $class . '.Class.php'; …Run Code Online (Sandbox Code Playgroud) 我的代码有什么问题:
$i = new RegexIterator(
  new ArrayIterator(array(
    'test1'=>'test888', 
    'test2'=>'what?', 
    'test3'=>'test999')),
  '/^test(.*)/',
  RegexIterator::REPLACE);
foreach ($i as $name=>$value)
  echo $name . '=>' . $value . "\n";
Run Code Online (Sandbox Code Playgroud)
迭代器是空的,为什么?谢谢你的帮助!
我正在尝试在PHP 5+中获取对象实例的唯一ID.
该函数spl_object_hash()可从PHP 5.2获得,但我想知道是否有旧的PHP版本的解决方法.
php.net上的评论中有几个函数,但它们并不适合我.第一个(简化):
function spl_object_hash($object){
    if (is_object($object)){
        return md5((string)$object);
        }
    return null;
    }
Run Code Online (Sandbox Code Playgroud)
不适用于本机对象(如DOMDocument),第二个:
function spl_object_hash($object){
    if (is_object($object)){
        ob_start();
        var_dump($object);
        $dump = ob_get_contents();
        ob_end_clean();
        if (preg_match('/^object\(([a-z0-9_]+)\)\#(\d)+/i', $dump, $match)) {
            return md5($match[1] . $match[2]);
            }
        }
    return null;
    }
Run Code Online (Sandbox Code Playgroud)
看起来它可能是一个主要的性能破坏者!
有人有什么东西吗?
我一直在阅读有关PHP从SPL常用的接口,如Iterator,Countable和ArrayAccess.但是,我不确切地知道它们是如何工作的.
他们的实现是否修改了PHP的核心功能,例如重载[]数组运算符?
我还读过有关Operator扩展的内容,它提供了以与低级语言相同的方式重载其他运算符的能力.由于Operator扩展明确地修改了PHP核心,我想知道ArrayAccess幕后是否采取相同的行动?
我是一个修补匠,因此我发现很难在不知道引擎盖的情况下使用它.
当在PHP中使用迭代器时,你可以使用iterator_to_array函数来提取迭代产生的数组.例如,假设您有以下内容ArrayObject:
$array_object = new ArrayObject(array(
   array('1', '2', '3', '4'),
   array('5', '6', '7', '8'),
   array('9', '10', '11', '12'),
));
Run Code Online (Sandbox Code Playgroud)
如您所见,它的存储是一个二维数组.
我们可以创建一个FilterOperator只接受它的第一个项目(我知道它会更好LimitIterator,它只是作为一个示例目的):
class myFilterIterator extends FilterIterator
{
   public function accept()
   {
      return ($this->key() === 0);
   }
}
$filter_iterator = new myFilterIterator(new ArrayIterator($array_object));
Run Code Online (Sandbox Code Playgroud)
现在,如果我这样做:
print_r(iterator_to_array($filter_iterator));
Run Code Online (Sandbox Code Playgroud)
如果我手动循环运算符,我得到的数组:
Array ( [0] => Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 ) )
Run Code Online (Sandbox Code Playgroud)
但是现在如果我想和一个人一起工作RecursiveFilterIterator呢?比方说我有:
class myRecursiveFilterIterator extends RecursiveFilterIterator
{
   public …Run Code Online (Sandbox Code Playgroud) 我制作了一个按预期工作的自动加载器类,但我发现了一个奇怪的行为.当我回显出发现的类的结果时,会传递给处理spl_autoload_register()函数的方法.我看到我有双打.就像脚本被调用两次一样,并且因为它是一个单例,数据在我的情况下构建了2个数组.
我正在使用这种方法来创建我的单身人士
public static function init()
{
    if (!isset(self::$instance))
        self::$instance = new self();
    return self::$instance;
}
Run Code Online (Sandbox Code Playgroud)
然后我将构造函数设置为private.我已经通过每个方法调试试图看看它在哪里创建自己的克隆.
我怀疑我的类和类已被克隆到spl_autoload_register()函数中的某个地方.
任何帮助,将不胜感激.
我正在尝试OuterIterator在类上实现接口,但不确定在该方法中使用什么getInnerIterator。我知道它应该返回一个Iterator,但是我不明白在什么情况下应该返回一个Iterator,InnerIterator尽管它已经具有Iterator接口的所有方法,那么为什么需要一个InnerIterator?
我完全迷失了 OuterIterator
class myouterIterator implements OuterIterator 
{
    /**
    * Returns the inner Iterator for the current entry
    */
    public $data = array(1,2,3,4,5,6,7,8,9,10);
    public $position = 0;
    public function getInnerIterator()
    {
        // What code should be place here
    }
    public function rewind()
    {
        $this->position = 0;
    }
    public function valid()
    {
        return isset($this->data[$this->position]);
    }
    public function key()
    {
        return $this->position;
    }
    public function current()
    {
        return $this->data[$this->position];
    }
    public function next()
    { …Run Code Online (Sandbox Code Playgroud)