为什么这么多人仍然在标准库中编写糟糕的版本?不要追求PHP开发人员,但是人们去阅读PHP SPL
DatePeriod是一个用于处理重复日期的PHP类.它的方法数量非常有限.因此,当我想要使用重复日期执行基本数组函数时,我必须将其复制到数组中iterator_to_array.奇怪的是,复制它似乎破坏了它.有什么想法吗?
$p=new DatePeriod(date_create('2008-01-01'),
                  DateInterval::createFromDateString( "+2 days" ),
                  date_create('2008-12-31')); 
echo count(iterator_to_array($p)); //183 
$a=iterator_to_array($p); 
echo count($a); //0 
Run Code Online (Sandbox Code Playgroud) 有人建议使用SplObjectStorage来跟踪一组独特的东西.很好,除了它不适用于字符串.错误说"SplObjectStorage :: attach()期望参数1是对象,在第59行的fback.php中给出的字符串"
有任何想法吗?
问题:我正在尝试扩展PHP ArrayObject,如下所示.不幸的是,我无法在设置多维对象时使其正常工作,而是因为我在PHP中启用了严格设置而引发错误.(Error: Strict standards: Creating default object from empty value)
问题:如何修改我的课程以自动为我创建不存在的级别?
代码:
$config = new Config;
$config->lvl1_0 = true; // Works
$config->lvl1_1->lvl2 = true; // Throws error as "lvl1" isn't set already
class Config extends ArrayObject
{
    function __construct() {
        parent::__construct(array(), self::ARRAY_AS_PROPS);
    }
    public function offsetSet($k, $v) {
        $v = is_array($v) ? new self($v) : $v;
        return parent::offsetSet($k, $v);
    }
}
Run Code Online (Sandbox Code Playgroud) 我需要在文件夹及其子文件夹中列出所有文件(具有特定扩展名).我使用了RecursiveIteratorIterator,如@Matthew在PHP中的完美答案所列目录中的所有文件.
最后一件事:显示文件树,或者所有没有子目录的目录,都是处理文件时可能想要做的事情的例子.您如何建议将此数据传递给客户端,数据结构如何?
PHP的一个局限是对象总是评估为true.但是SplFileinfo(和Symfony的子类UploadedFile)表现不同:
$a = new ArrayIterator();       // or any other class
$b = new SplFileInfo(__FILE__); // file used is not important
if ($a) echo 'true';   // 'true'
if (!$a) echo 'false'; // nothing because $a is true
if ($b) echo 'true';   // 'true'
if (!$b) echo 'false'; // Catchable fatal error: Object of class 
                       // SplFileInfo could not be converted to boolean
Run Code Online (Sandbox Code Playgroud)
这是一个错误吗?测试在5.3和5.4.也发生在SplFileObject.可能的相关问题.和2011年的Symfony问题.
通过实现所有必要的SPL接口,是否可以编写一个几乎与实际PHP数组无法区分的类?他们是否遗漏了任何关键的东西?
我想构建一个更高级的Array对象,但我想确保如果我用自定义Array类替换它们,我不会破坏现有的使用数组的应用程序.
在java和C++中我们不知道size - 数组没有像在PHP中那样使用,而是使用了LinkedList等.
在PHP中存在SPL,但大多数时候程序员都使用数组,为什么(因为人们不了解SPL)?
当我们在PHP和whenSPL中使用Array时,PHP和Java/C++之间的区别是什么?
在以下代码中:
$storage = new \SplObjectStorage();
$fooA = new \StdClass();
$fooB = new \StdClass();
$storage[$fooA] = 1;
$storage[$fooB] = array();
$storage[$fooA] = 2;
$storage[$fooB][] = 'test';
Run Code Online (Sandbox Code Playgroud)
我希望$storage[$fooA]是1,它是.我也希望$storage[$fooB]如此array('test'),但事实并非如此.这也会触发一条通知,内容为"间接修改SplObjectStorage的重载元素对...没有影响"
我认为这是因为ArrayAccessin 的实现SplObjectStorage不通过引用返回值.
有没有办法SplObjectStorage用作数据映射,其中键是对象,值是可变数组?做这种工作还有其他可行的选择吗?
堆的PHP实现真的是一个完整的实现吗?
当我读到这篇文章http://en.wikipedia.org/wiki/Heap_%28data_structure%29时,我认为子节点有一个特定的父节点,而父节点有特定的子节点.
当我查看PHP文档中的示例时,http://au.php.net/manual/en/class.splheap.php,似乎子节点都共享相同的"级别",但特定的父级/儿童信息并不重要.
例如,哪个节点是PHP示例中排名第10的三个节点中的每个节点的父节点?
在我的应用程序中,当用户选择"节点156"时,我需要知道它的孩子是谁,这样我每次访问都可以支付.(我可以使他们的身份'节点1561','节点1562'等,所以这种关系很明显).
PHP堆实现是否不完整?我应该忘记Spl课程并走自己的路吗?或者我错过了关于堆应该如何运作的一些信息?或许我应该看一下特定的堆变体?
谢谢堆!
php ×10
spl ×10
arrays ×3
oop ×2
arrayaccess ×1
arrayobject ×1
file ×1
iterator ×1
truthiness ×1