在某些情况下,无序定义PHP类扩展会导致致命错误,而在某些情况下则不会。我正在尝试了解潜在的行为。
例如,两者
<?php
class BaseClass {}
class FirstExt extends BaseClass {}
Run Code Online (Sandbox Code Playgroud)
和
<?php
class FirstExt extends BaseClass {}
class BaseClass {}
Run Code Online (Sandbox Code Playgroud)
很好,所以不是简单地无序定义子类就不会引起问题。
但是,当涉及到三个类时(仅在一种特定情况下),即以相反的顺序定义类链时,就会出现错误。也就是说,以下代码将导致致命错误:
<?php
class SecondExt extends FirstExt {}
class FirstExt extends BaseClass {}
class BaseClass {}
Run Code Online (Sandbox Code Playgroud)
如果您尝试从命令行运行此命令(例如main.php),则会得到
PHP Fatal error: Class 'FirstExt' not found in /path/to/main.php on line 2
Run Code Online (Sandbox Code Playgroud)
但是,三个类的其他五个顺序中的任何一个都没有错误。我很惊讶,即使
<?php
class SecondExt extends FirstExt {}
class BaseClass {}
class FirstExt extends BaseClass {}
Run Code Online (Sandbox Code Playgroud)
工作正常。区别因素是,在给出错误的情况下,所有三对可能的类对都是乱序,而在所有其他情况下,三对中的最多两对是乱序。
发生这种情况是怎么回事?
$pdffile我有一个 Perl 脚本,可以在临时目录中生成 pdf$tempdir并使用xdg-open. 一旦用户查看完文件,脚本就应该删除工作目录。这是我遇到问题的代码部分:
system "xdg-open $pdffile";
remove_tree($tempdir);
Run Code Online (Sandbox Code Playgroud)
我的理解system是它应该等到命令返回后再继续程序。但是,当我执行此代码时,我收到一条消息“无法打开/tmp/diff14969/diffs.pdf”。如果我在命令中替换xdg-open为okular(这是我的系统默认值)system,它就会按照我想要的方式工作。(同样,如果我对系统上的任何 pdf 查看器进行硬编码,它也可以工作,但出于可移植性的原因,我不想这样做。)
我的猜测是,这xdg-open是在一个新进程中启动查看器,并且该system命令仅等待xdg-open完成。成功返回后xdg-open,脚本将在查看器打开文件之前删除临时目录。如何让脚本等待实际查看者完成?