我正在扩展其中一个SPL(标准PHP库)类,我无法调用父的构造函数.这是我得到的错误:
致命错误:无法调用构造函数
以下是该SplQueue文档的链接:http://www.php.net/manual/en/class.splqueue.php
这是我的代码:
$queue = new Queue();
class Queue extends SplQueue {
    public function __construct() {
        echo 'before';
        parent::__construct();
        echo 'I have made it after the parent constructor call';
    }
}
exit;
Run Code Online (Sandbox Code Playgroud)
什么可以阻止我调用父的构造函数?
为什么以下
$a = new SplFixedArray(5);
$a[0] = array(1, 2, 3);
$a[0][0] = 12345; // here
var_dump($a);
Run Code Online (Sandbox Code Playgroud)
产生
Notice: Indirect modification of overloaded element of SplFixedArray has no effect in <file> on line <indicated>
Run Code Online (Sandbox Code Playgroud)
这是一个错误吗?那么你如何处理多维SplFixedArrays呢?任何解决方法?
我还没有找到一个很好的例子,说明如何使用php RegexIterator递归遍历目录.
最终的结果是我想指定一个目录并查找其中包含一些给定扩展名的所有文件.比如说只有html/php扩展名.此外,我想过滤掉.Trash-0,.Trash-500等类型的文件夹.
<?php 
$Directory = new RecursiveDirectoryIterator("/var/www/dev/");
$It = new RecursiveIteratorIterator($Directory);
$Regex = new RegexIterator($It,'/^.+\.php$/i',RecursiveRegexIterator::GET_MATCH);
foreach($Regex as $v){
    echo $value."<br/>";
}
?>
Run Code Online (Sandbox Code Playgroud)
到目前为止我得到的结果是:致命错误:带有消息'RecursiveDirectoryIterator :: __ construct(/media/hdmovies1/.Trash-0)的未捕获异常'UnexpectedValueException'
有什么建议?
我试图在文档中理解STD_PROP_LIST常量,但到目前为止我还没理解它,并且没有找到任何解释:(文档有以下示例:
$a = new ArrayObject(array(), ArrayObject::STD_PROP_LIST);
$a['arr'] = 'array data';                             
$a->prop = 'prop data';                               
$b = new ArrayObject();                                   
$b['arr'] = 'array data';                             
$b->prop = 'prop data';                               
// ArrayObject Object                                     
// (                                                      
//      [prop] => prop data                               
// )                                                      
print_r($a);                                              
// ArrayObject Object                                     
// (                                                      
//      [arr] => array data                               
// )                                                      
print_r($b);
Run Code Online (Sandbox Code Playgroud)
两种印刷品都给我相同的结果:
ArrayObject Object ( [prop] => prop data [storage:ArrayObject:private] => Array ( [arr] =>      array data ) ) 
ArrayObject Object ( [prop] => prop data [storage:ArrayObject:private] => Array …Run Code Online (Sandbox Code Playgroud) PHP中是否有SPL反向数组迭代器?如果没有,那么实现它的最佳方法是什么?
我可以干脆做
$array = array_reverse($array);
foreach($array as $currentElement) {}
Run Code Online (Sandbox Code Playgroud)
要么
for($i = count($array) - 1; $i >= 0; $i--)
{
}
Run Code Online (Sandbox Code Playgroud)
但是有更优雅的方式吗?
我正在检查标准PHP库(SPL).我之前只使用过数组,刚才发现PHP有很多标准类.但手册中没有任何词语是否建议使用它.例如,他们明确建议使用foreach构造来迭代数组,因为它更快.那图书馆怎么样?如果我需要在一个对象中存储一些数据,我应该为我的情况使用一些具体的SPL类,还是使用标准数组更好?
该标准PHP库包括哪些资源调用观察者模式的参考实现,通过的方式SplSubject和SplObserver课程.对于我的生活,我无法弄清楚这些是如何非常有用的,无法将实际事件或任何其他信息与通知一起传递:
class MySubject implements SplSubject {
    protected $_observers = [];
    public function attach(SplObserver $observer) {
        $id = spl_object_hash($observer);
        $this->_observers[$id] = $observer;
    }
    public function detach(SplObserver $observer) {
        $id = spl_object_hash($observer);
        if (isset($this->_observers[$id])) {
            unset($this->_observers[$id]);
        }
    }
    public function notify() {
        foreach ($this->_observers as $observer) {
            $observer->update($this);
        }
    }
}
class MyObserver implements SplObserver {
    public function update(SplSubject $subject) {
        // something happened with $subject, but what
        // was it???
    }
}
$subject = new …Run Code Online (Sandbox Code Playgroud) 为了扩展我的编程能力,我已经深入研究了标准PHP库.这导致我发现了这门SplDoublyLinkedList课程.从那里我阅读维基百科上的链接列表和双重链接列表的描述.
我理解它们是如何工作的...但是我无法想象为什么我们需要它 - 或者更好的是一个实际的例子,SplDoublyLinkedList因为我们在PHP中有索引和关联数组.
链接列表通常用于PHP的进出?
我怀疑我在这里做了些蠢事,但我对SPL的一个简单问题感到困惑:
如何使用RecursiveArrayIterator/RecursiveIteratorIterator修改数组的内容(本例中的值)?
使用以下测试代码,我可以使用getInnerIterator()和offsetSet()更改循环内的值,并在循环中转储已修改的数组.
但是当我离开循环并从迭代器转储数组时,它又回到了原始值.发生了什么?
$aNestedArray = array();
$aNestedArray[101] = range(100, 1000, 100);
$aNestedArray[201] = range(300, 25, -25);
$aNestedArray[301] = range(500, 0, -50);
$cArray = new ArrayObject($aNestedArray);
$cRecursiveIter = new RecursiveIteratorIterator(new RecursiveArrayIterator($cArray), RecursiveIteratorIterator::LEAVES_ONLY);
// Zero any array elements under 200  
while ($cRecursiveIter->valid())
{
    if ($cRecursiveIter->current() < 200)
    {
        $cInnerIter = $cRecursiveIter->getInnerIterator();
        // $cInnerIter is a RecursiveArrayIterator
        $cInnerIter->offsetSet($cInnerIter->key(), 0);
    }
    // This returns the modified array as expected, with elements progressively being zeroed
    print_r($cRecursiveIter->getArrayCopy()); …Run Code Online (Sandbox Code Playgroud) 到目前为止,我已经使用了程序独立的自动加载器函数,并使用spl_autoload_register()注册它们以自动加载我的(通常)命名空间类.最近,我注意到人们提到将自动加载器类与一些着名的PHP框架结合使用.
我的代码几乎所有代码都是面向对象的,但在这个实例中,我并没有看到在基本函数中使用类"Autoloader"的优势.在可测试性方面,我觉得在我的测试中使用class_exists()检查来验证过程函数是否正确加载文件.
所以我的问题是三个:
UPDATE
下面是我可能使用的典型自动加载功能的一些示例代码.它是元代码,所以不要寻找错别字.我组织我的目录结构,以便它们镜像命名空间.从explode_namespaces()理论上讲,假设函数可以作为静态方法与autoload()类中的静态方法一起包含在内,这是一个好处.将这些不同的"实用程序"函数组合为单个类中的方法可能更清晰.
function autoload($class_name)
{
  $root = APP_LIBS; // a directory path constant set at config time
  if ($namespaces = explode_namespaces($class_name)) {
    $domain = array_shift($namespaces);
    $root  .= "/$domain/";
    $class_name = array_pop($namespaces);
    $directories = array();
    foreach ($namespaces as $directory) {
      $directories[] = $directory;
    }
    $root .= implode($directories, '/');
  }
  $file = "$root/$class_name.php";
  if (file_exists($file)) {
    include $file;
  }
}
Run Code Online (Sandbox Code Playgroud) php ×10
spl ×10
iterator ×2
arrayobject ×1
arrays ×1
autoload ×1
constructor ×1
linked-list ×1
loops ×1
oop ×1
regex ×1
reverse ×1