PHP interperts的代码,这意味着它每次运行程序时运行源代码.随着代码的读取(这使得行号打印输出变得微不足道),这样做的好处就在于它.然而,由于您无法进行深入优化(或进行任何运行前错误检查),因此其它方式通常都是昂贵的.

Java compiles its code into a JVM assembly language called “bytecode.”这意味着什么是运行通常不能访问(甚至使用)源代码.也就是说,有技巧.编译的Java类可以添加“额外的数据”,其中一个“额外的数据元素”是a line number table,这是一个索引,允许某人运行程序集“编制”编译器记录的行号.

这通常可以正常工作,考虑到:编译器通常不标记每个指令,源代码可能不可用,优化可能会使某些内部代码块无法以便于指向输入代码文本的方式运行.

代码覆盖工具如何“修复”这一点,它们通常将代码(在程序集级别)插入到大量有效地用作日志记录语句的命令中,该格式允许工具确定通过代码实际遵循的路径.然后通过行号表尽可能地映射回来,然后用于突出原始源文件中的行.

如果你想要更精细的分辨率(可以处理一行的哪一部分被执行的东西),那么你需要深入挖掘.最终,您甚至可能会考虑编写自己的编译器(或编译器扩展),它将存储您自己的自定义行号表,克服了当前解决方案的缺点.

抛出异常(如Shiven所提到的)和解析行号的技巧做得很好;但是,对于真正不例外的项目,它们会以奇异的异常处理来污染您的代码,只是为了获取行号.由于代码杂乱和异常的运行时性能较差,我倾向于避免使用这样的解决方案(但它们可以工作).

无论如何,希望这将给你一个看法,为什么它并不总是像PHP完全一样的工作.