Update: 2011-03-30
经过一段时间的research,已经证明这篇文章 写的内容是错的。不删除这篇文章,仅仅只是用来做research过程中的记录。
错误的问题很简单,在编译后的二进制可执行文件里,其实已经无所谓load不load的问题了,所有的,你需要的类资源都已经被编译进去了 。我尝试过一种很极端的方式,A代码里实例化了B类,但是在A代码里没有实现autoload函数也没有include过B 类的代码文件。编译的时候启用--input-list参数,给出所有的代码文件位置。编译后的可执行文件运行起来一点问题都没有,说明了本文下述的内容都是错的。

hiphop-php毕竟是一个第三方的软件工具,能不能与我们已经写好的软件相互兼容是一个很现实的问题。
这次来测试下__autoload这个方法:

很简单的2个PHP文件:
tryit.php:/var/www/tryit.php(使用index.php作为文件名的时候会发生问题,暂时还不知道是为什么)因为服务器配置问题,下同
[codesyntax lang="php"]

<?php
// 0. init script
echo 'hiphop autoload test: ';

// 1. using autoload class
class ClassLoader {
    protected $classes = array (
        'HiphopTest' => '/var/hiphop/lib/HiphopTest.php',
    );

    public function getClass($className) {
        $class = $this->classes[$className];
        if (!$class) {
            throw new Exception('Class not found!');
        } else {
            return $class;
        }
    }
}

function __autoload($className) {
    $loader = new ClassLoader();
    include_once $loader->getClass($className);
}

// 2. include source directly
//include_once '/var/hiphop/lib/HiphopTest.php';

echo 'output start: ';
new HiphopTest();

[/codesyntax]
HiphopTest.php:/var/hiphop/lib/HiphopTest.php
[codesyntax lang="php"]

<?php
class HiphopTest {
    function __construct() {
        echo 'This is the content from autoload class';
    }
}

[/codesyntax]

1. 按照上一篇文章所述的方法编译,第一次使用autoload,把第二点注释掉。
因为使用autoload,需要使用--input-list这个参数,指定一个列表文件,把所有需要编译的文件的位置(HiphopTest.php)指给hiphop看。
配置文件:/var/www/list.conf
[codesyntax lang="c"]

/var/www/tryit.php
/var/hiphop/lib/HiphopTest.php

[/codesyntax]
[codesyntax lang="c"]

cd /var/www
hphp -k 1 -l 3 --input-list=/var/www/list.conf

[/codesyntax]
结果:
使用autoload的时候程序无法执行,在打开页面的时候,先出现空白页面,然后突然就页面无法访问。

2. 第二次使用硬加载的方式,把第一点注释掉。
[codesyntax lang="c"]

cd /var/www
hphp -k 1 -l 3 tryit.php

[/codesyntax]
无需给hiphop指明HiphopTest.php这个文件,hiphop会根据include_once代码自动寻找并编译这个文件。
结果:
执行很顺利,output:
[codesyntax lang="c"]

hiphop autoload test: output start: This is the content from autoload class

[/codesyntax]

3. autoload的结果还是蛮不能接受的,阅读了下hiphop的document,发现了debug模式,尝试下。首先需要将tryit.php代码转成autoload模式,接下来:
[codesyntax lang="c"]

 hphpi -m debug -f /var/www/tryit.php

[/codesyntax]
在hphpd命令行中打:continue
[codesyntax lang="c"]

hphpd> continue

[/codesyntax]
可以发现结果很正确:
[codesyntax lang="c"]

hiphop autoload test: output start: This is the content from autoload class
Program /var/www/tryit.php exited normally.

[/codesyntax]
也就是说hiphop如果直接从php文件解析并执行的话,结果是正确的,但是当代码文件被编译并挂在服务器上之后,就无法正常执行了。
我现在还没搞明白到底是什么地方的问题,但是结论已经很明显了,使用硬加载的话程序是没有问题的,当前版本还是放弃使用autoload会比较好。

Update: 2011-03-30
经过2天的测试与实验,最终发现事实并不是这样的。现在的问题是,只要不是使用完整文件地址来做include的话就会出问题,比如说define一个常量,并用常量来组成include文件地址的一部分,或者使用hiphop推荐的配置文件方法来指明include的常量值,或者使用hiphop自带的参数来指明--include-path,这三种方法最后都会出现Not Found错误。现阶段还不知道怎么解决这个问题,我被卡住了。

问题明解决了:其实问题很简单,在所有以上几种的include方法中,编译都没有报错。这可以在加了--gen-stats参数后在编译出的报告文件中得知。那么,问题就很简单了,编译没有问题,有问题的肯定就是启动后的服务器的问题了。经过一段时间的research,果然是服务器的问题,启动服务器的默认参数配置的有问题。请参考关于服务器配置的文章。