Bug #55701 [Com]: GlobIterator throws LogicException with message 'The parent constructor was not

From: Date: Sun, 10 Aug 2014 10:57:12 +0000
Subject: Bug #55701 [Com]: GlobIterator throws LogicException with message 'The parent constructor was not
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-187063@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=55701&edit=1 ID: 55701 Comment by: hanskrentel at yahoo dot de Reported by: bs@php.net Summary: GlobIterator throws LogicException with message 'The parent constructor was not Status: Assigned Type: Bug Package: SPL related Operating System: Linux, OSX PHP Version: 5.3.8 Assigned To: cataphract Block user comment: N Private report: N New Comment: Additionally I can not reproduce the original report: ----------------------------------------------------- <?php $g = new \GlobIterator(__DIR__ . '/*'); do { $g->next(); } while($g->valid()); ---------------------------------------------------- Works flawlessly for me. Using 5.5.15 Previous Comments: ------------------------------------------------------------------------ [2014-08-10 10:53:44] hanskrentel at yahoo dot de SplFileObject checks on method invocation that the state is sane - it does not care whether or not you have it extended. Whether or not this qualifies as a bug (I tend to say it isn't a flaw, because SplFileObject has it's responsibilities and if you extend from it, you're explicitly stating that your object comes with the same responsibilities, you can not lower the checks). However, if you actually want to stub the file-object first, that must not stand in your way, it's easy to work-around, for example with a fake "data://" URI: <?php /* * File: test.php * Link: https://bugs.php.net/bug.php?id=55701 */ class MyFileObject extends \SplFileObject { public function __construct($file_name) { parent::__construct("data://,"); $new_fname = $this->getRealPath(); parent::__construct($file_name); } public function getRealPath() { return '/tmp/foo.txt'; } } $f1 = new MyFileObject(__FILE__); var_dump($f1->getBasename()); # string(8) "test.php" ------------------------------------------------------------------------ [2014-02-26 14:11:20] log dot kot at gmail dot com Confirm the bug Ubuntu Linux 13.10 3.11.0-17-generic x86_64 PHP 5.5.3-1ubuntu2.1 (cli) (built: Dec 12 2013 04:24:35) Copyright (c) 1997-2013 The PHP Group Zend Engine v2.5.0, Copyright (c) 1998-2013 Zend Technologies with Zend OPcache v7.0.3-dev, Copyright (c) 1999-2013, by Zend Technologies with Xdebug v2.2.3, Copyright (c) 2002-2013, by Derick Rethans ------------------------------------------------------------------------ [2013-08-02 11:54:52] rosier at interstroom dot nl I can confirm this unexpected result also for php54 and php55 Test script: --------------- <?php $path_to_files = sys_get_temp_dir(); // Next works as expected: no xml files found = no output foreach (new GlobIterator($path_to_files . '/*.xml') as $fileinfo) { echo $fileinfo->getFilename() . "\n"; } $it = new GlobIterator($path_to_files . '/*.xml'); // Expected result: count = 0 // Instead next line will crash php if no xml files are found if ($it->count()) { // do something... } ?> ------------------------------------------------------------------------ [2013-01-28 07:38:40] sergei dot solomonov at gmail dot com I have same problem too. OS: windows 7 x64, PHP 5.4.7 (built: Sep 12 2012 23:48:31). I working with ZF2, when I trying to use phar-packed modules same error occured. But in Ubuntu works fine. ------------------------------------------------------------------------ [2012-12-21 12:18:51] ivanderberg at hostnet dot nl I can confirm what "[2012-03-19 21:24 UTC] maciej dot sz at gmail dot com" said in a more simplistic way. This class fails in my current version (PHP 5.3.14 (cli) (built: Jun 19 2012 07:35:36)) on $this->touchLockFile(...) As I really need $file before calling the parent constructor, I have no other option than making it static <?php /** * @author Iltar van der Berg <ivanderberg@hostnet.nl> */ class Lock extends \SplFileObject { /** * @param string $file_name * @param string $open_mode * @param Filesystem $filesystem * @param string $lock_directory */ public function __construct($file_name, $open_mode = 'r', Filesystem $filesystem = null, $lock_directory = '/var/lock') { $filesystem = $filesystem ?: new Filesystem(); $file = $this->touchLockFile($file_name, $lock_directory, $filesystem); parent::__construct($file, $open_mode); } /** * Returns true if the lock is placed, false if unable to * * @return boolean */ public function lock() { return $this->flock(LOCK_EX | LOCK_NB); } /** * Returns true if the lock is released * * @return bool */ public function release() { return $this->flock(LOCK_UN); } /** * Attempts to create a lock file for a given filename and directory * it will return a string if the file is touched * * @param string $file_name * @param string $lock_directory * @param Filesystem $filesystem * @return string */ private function touchLockFile($file_name, $lock_directory, Filesystem $filesystem) { $lock_file_path = explode('/', $file_name); $lock_file = array_pop($path); $path = empty($lock_file_path) ? "$lock_directory/$lock_file" : $lock_directory . implode('/', $lock_file_path); $lock_file = "$path/$lock_file.lock"; if(!$filesystem->exists($path) || !is_dir($path)) { $filesystem->mkdir($path, 0733); } // some modes create this file already, but we force it in // that way the lock file always exists no matter what mode $filesystem->touch($lock_file); return $lock_file; } } ?> ------------------------------------------------------------------------ The remainder of the comments for this report are too long. To view the rest of the comments, please view the bug report online at https://bugs.php.net/bug.php?id=55701 -- Edit this bug report at https://bugs.php.net/bug.php?id=55701&edit=1

« previous php.bugs (#187063) next »