Using PHP 5.3.0.
I know that you can get errors pointing to line 0 when executing code from the shell (using php -a or php -r ). I also know that you can get line 0 errors when an exception is thrown during the execution of a custom exception handler. These are logical reasons why PHP may not be able to provide me with the line number for the error. But now I get errors on line 0, although I don't do either one or the other. This kind of thing:
Fatal error: Call to a member function items() on a non-object in /Users/ole/pap/gtd/fu/lib/tree.php on line 0
I am not asking for help debugging my code here just for the reason why PHP cannot give me the correct line number for these errors. In any case, this last error turned out to be in fact on line 237 (just a simple case of incorrect writing incorrectly).
So what I did was intentionally reintroduced the error message and fit into the debug_print_backtrace() call. Here is what I got:
#0 FuTreeSerializer->serialize(FuLinkedTreeNodeList Object ([outer] => ,[items] => Array ([0] => FuTreeNode Object ([outer] => ,[inners] => FuLinkedTreeNodeList Object ([outer] => FuTreeNode Object ( *RECURSION*,[items] => Array ()),[value] => foo,[next] => FuTreeNode Object ([outer] => ,[inners] => FuLinkedTreeNodeList Object ([outer] => FuTreeNode Object ( *RECURSION*,[items] => Array ()),[value] => bar,[next] => FuTreeNode Object ([outer] => ,[inners] => FuLinkedTreeNodeList Object ([outer] => FuTreeNode Object ( *RECURSION*,[items] => Array ()),[value] => foo,[next] => FuTreeNode Object ([outer] => ,[inners] => FuLinkedTreeNodeList Object ([outer] => FuTreeNode Object ( *RECURSION*,[items] => Array ()),[value] => zim,[next] => ,[prev] => FuTreeNode Object ( *RECURSION*,[ofList] => FuLinkedTreeNodeList Object ( *RECURSION*),[prev] => FuTreeNode Object ( *RECURSION*,[ofList] => FuLinkedTreeNodeList Object ( *RECURSION*),[prev] => FuTreeNode Object ( *RECURSION*,[ofList] => FuLinkedTreeNodeList Object ( *RECURSION*),[prev] => ,[ofList] => FuLinkedTreeNodeList Object ( *RECURSION*),[1] => FuTreeNode Object ([outer] => ,[inners] => FuLinkedTreeNodeList Object ([outer] => FuTreeNode Object ( *RECURSION*,[items] => Array ()),[value] => bar,[next] => FuTreeNode Object ([outer] => ,[inners] => FuLinkedTreeNodeList Object ([outer] => FuTreeNode Object ( *RECURSION*,[items] => Array ()),[value] => foo,[next] => FuTreeNode Object ([outer] => ,[inners] => FuLinkedTreeNodeList Object ([outer] => FuTreeNode Object ( *RECURSION*,[items] => Array ()),[value] => zim,[next] => ,[prev] => FuTreeNode Object ( *RECURSION*,[ofList] => FuLinkedTreeNodeList Object ( *RECURSION*),[prev] => FuTreeNode Object ( *RECURSION*,[ofList] => FuLinkedTreeNodeList Object ( *RECURSION*),[prev] => FuTreeNode Object ([outer] => ,[inners] => FuLinkedTreeNodeList Object ([outer] => FuTreeNode Object ( *RECURSION*,[items] => Array ()),[value] => foo,[next] => FuTreeNode Object ( *RECURSION*,[prev] => ,[ofList] => FuLinkedTreeNodeList Object ( *RECURSION*),[ofList] => FuLinkedTreeNodeList Object ( *RECURSION*),[2] => FuTreeNode Object ([outer] => ,[inners] => FuLinkedTreeNodeList Object ([outer] => FuTreeNode Object ( *RECURSION*,[items] => Array ()),[value] => foo,[next] => FuTreeNode Object ([outer] => ,[inners] => FuLinkedTreeNodeList Object ([outer] => FuTreeNode Object ( *RECURSION*,[items] => Array ()),[value] => zim,[next] => ,[prev] => FuTreeNode Object ( *RECURSION*,[ofList] => FuLinkedTreeNodeList Object ( *RECURSION*),[prev] => FuTreeNode Object ([outer] => ,[inners] => FuLinkedTreeNodeList Object ([outer] => FuTreeNode Object ( *RECURSION*,[items] => Array ()),[value] => bar,[next] => FuTreeNode Object ( *RECURSION*,[prev] => FuTreeNode Object ([outer] => ,[inners] => FuLinkedTreeNodeList Object ([outer] => FuTreeNode Object ( *RECURSION*,[items] => Array ()),[value] => foo,[next] => FuTreeNode Object ( *RECURSION*,[prev] => ,[ofList] => FuLinkedTreeNodeList Object ( *RECURSION*),[ofList] => FuLinkedTreeNodeList Object ( *RECURSION*),[ofList] => FuLinkedTreeNodeList Object ( *RECURSION*),[3] => FuTreeNode Object ([outer] => ,[inners] => FuLinkedTreeNodeList Object ([outer] => FuTreeNode Object ( *RECURSION*,[items] => Array ()),[value] => zim,[next] => ,[prev] => FuTreeNode Object ([outer] => ,[inners] => FuLinkedTreeNodeList Object ([outer] => FuTreeNode Object ( *RECURSION*,[items] => Array ()),[value] => foo,[next] => FuTreeNode Object ( *RECURSION*,[prev] => FuTreeNode Object ([outer] => ,[inners] => FuLinkedTreeNodeList Object ([outer] => FuTreeNode Object ( *RECURSION*,[items] => Array ()),[value] => bar,[next] => FuTreeNode Object ( *RECURSION*,[prev] => FuTreeNode Object ([outer] => ,[inners] => FuLinkedTreeNodeList Object ([outer] => FuTreeNode Object ( *RECURSION*,[items] => Array ()),[value] => foo,[next] => FuTreeNode Object ( *RECURSION*,[prev] => ,[ofList] => FuLinkedTreeNodeList Object ( *RECURSION*),[ofList] => FuLinkedTreeNodeList Object ( *RECURSION*),[ofList] => FuLinkedTreeNodeList Object ( *RECURSION*),[ofList] => FuLinkedTreeNodeList Object ( *RECURSION*))), -1) called at [/Users/ole/pap/gtd/fu/lib/tree.php:128] #1 FuLinkedTreeNodeList->asStr() called at [/Users/ole/pap/gtd/fu/spec/tree.php:52] #2 FuTreeNodeSpec->_select() #3 ReflectionMethod->invoke(FuTreeNodeSpec Object ([methodPatterns] => Array ([run] => /^_/,[skip] => /^skip/i),[specCallTrace] => Array ([0] => Array ([function] => __call,[class] => PweVerifierInjecter,[object] => PweVerifierInjecter Object ([spec] => FuTreeNodeSpec Object ( *RECURSION*,[subj] => 1),[type] => ->,[args] => Array ([0] => shouldBe,[1] => Array ([0] => 1))),[1] => Array ([file] => /Users/ole/pap/gtd/fu/spec/tree.php,[line] => 47,[function] => shouldBe,[class] => PweVerifierInjecter,[object] => PweVerifierInjecter Object ([spec] => FuTreeNodeSpec Object ( *RECURSION*,[subj] => 1),[type] => ->,[args] => Array ([0] => 1)),[2] => Array ([function] => _list_equality,[class] => FuTreeNodeSpec,[object] => FuTreeNodeSpec Object ( *RECURSION*,[type] => ->,[args] => Array ()),[3] => Array ([file] => /Users/ole/pap/gtd/fu/lib/pwe.php,[line] => 187,[function] => invoke,[class] => ReflectionMethod,[object] => ReflectionMethod Object ([name] => _list_equality,[class] => FuTreeNodeSpec),[type] => ->,[args] => Array ([0] => FuTreeNodeSpec Object ( *RECURSION*)),[4] => Array ([file] => /Users/ole/pap/gtd/fu/lib/pwe.php,[line] => 192,[function] => each,[class] => PweSpec,[object] => FuTreeNodeSpec Object ( *RECURSION*,[type] => ->,[args] => Array ([0] => ReflectionMethod Object ([name] => _list_equality,[class] => FuTreeNodeSpec))),[5] => Array ([file] => /Users/ole/pap/gtd/fu/lib/pwe.php,[line] => 207,[function] => runMethods,[class] => PweSpec,[object] => FuTreeNodeSpec Object ( *RECURSION*,[type] => ->,[args] => Array ()),[6] => Array ([file] => /Users/ole/pap/gtd/fu/lib/pwe.php,[line] => 35,[function] => run,[class] => PweSpec,[object] => FuTreeNodeSpec Object ( *RECURSION*,[type] => ->,[args] => Array ([0] => PweTracker Object ([passes] => 33,[failures] => 0,[skips] => 0))),[7] => Array ([file] => /Users/ole/pap/gtd/fu/-,[line] => 4,[function] => runDefined,[class] => PweRunner,[object] => PweRunner Object ([specPattern] => /Spec$/i),[type] => ->,[args] => Array ())),[tracker] => PweTracker Object ([passes] => 33,[failures] => 0,[skips] => 0),[activeMethod] => ReflectionMethod Object ([name] => _select,[class] => FuTreeNodeSpec))) called at [/Users/ole/pap/gtd/fu/lib/pwe.php:187] #4 PweSpec->each(ReflectionMethod Object ([name] => _select,[class] => FuTreeNodeSpec)) called at [/Users/ole/pap/gtd/fu/lib/pwe.php:192] #5 PweSpec->runMethods() called at [/Users/ole/pap/gtd/fu/lib/pwe.php:207] #6 PweSpec->run(PweTracker Object ([passes] => 33,[failures] => 0,[skips] => 0)) called at [/Users/ole/pap/gtd/fu/lib/pwe.php:35] #7 PweRunner->runDefined() called at [/Users/ole/pap/gtd/fu/-:4]
If you scroll to the right, you will see that there is a lot of recursion of my data structures (this can be expected with the code I'm working on). But otherwise it is not a particularly long stack.
After google around, I managed to find some guys error log that seems to have the same problem.
I tried to find information about this on PHP errors, but the search system is not powerful enough to allow me to search for "on line 0" without missing some terms; important ones.