php类函数没有正确返回给调用者

时间:2012-06-18 16:08:12

标签: php return

背景
我正在为TeraWURFL编写一个新的数据库连接器文件,它将使用PDO扩展。有关详细信息,请检查

详情
我添加了一个新的数据库连接器 - TeraWurflDatabase_MySQL5_Mine.php并在配置文件中定义了相同的内容 - TeraWurflConfig.php(TeraWURFL中已有许多连接器文件,配置文件中的值决定使用哪一个) -

public static $DB_CONNECTOR = "MySQL5_Mine";

然后我编写了一个测试脚本来对新TeraWurflDatabase_MySQL5_Mine.php类文件的所有函数进行单元测试,以确保它们在更改后返回相同的值。我在测试脚本中遇到问题。

一切正常,但TeraWurflDatabase_MySQL5_Mine.php中名为rebuildCacheTable()的一个函数出错了。当我从我的测试脚本调用此函数时,控件不会在该函数内的return语句之后返回到我的测试脚本。 -

测试脚本中的代码test_connector.php -

/*file inclusiong start*/
require_once '/var/cake_1.2.0.6311-beta/app/webroot/Tera-Wurfl_PDO/TeraWurfl.php';
    require_once '/var/cake_1.2.0.6311-beta/app/webroot/Tera-Wurfl_PDO/TeraWurflConfig.php';

    require_once '/var/cake_1.2.0.6311-beta/app/webroot/Tera-Wurfl_PDO/DatabaseConnectors/TeraWurflDatabase.php'; //this file is same on both setups
    require_once '/var/cake_1.2.0.6311-beta/app/webroot/Tera-Wurfl_PDO/TeraWurflLoader.php';
    require_once '/var/cake_1.2.0.6311-beta/app/webroot/Tera-Wurfl_PDO/UserAgentFactory.php';
    require_once '/var/cake_1.2.0.6311-beta/app/webroot/Tera-Wurfl_PDO/UserAgentUtils.php';
    require_once '/var/cake_1.2.0.6311-beta/app/webroot/Tera-Wurfl_PDO/WurflConstants.php';
    require_once '/var/cake_1.2.0.6311-beta/app/webroot/Tera-Wurfl_PDO/WurflSupport.php';
    require_once '/var/cake_1.2.0.6311-beta/app/webroot/Tera-Wurfl_PDO/UserAgentMatchers/UserAgentMatcher.php';

    require_once '/var/cake_1.2.0.6311-beta/app/webroot/Tera-Wurfl_PDO/DatabaseConnectors/TeraWurflDatabase_MySQL5_Mine.php';
/*file inclusiong end*/


    $wurflDbPdoObj = new TeraWurflDatabase_MySQL5_Mine();
    $wurflDbPdoObj->connect();
    $dbObj = $wurflDbPdoObj;
    echo "before call";
    var_dump($dbObj->rebuildCacheTable());
    echo "after call"; //this does not execute if new TeraWurfl() object is initiated below

TeraWurflDatabase_MySQL5_Mine内的代码 -

class TeraWurflDatabase_MySQL5_Mine extends TeraWurflDatabase{
    ...
    ...

    public function rebuildCacheTable(){
       $rebuilder = new TeraWurfl(); //if this object is initiated, return does not happen properly
       return true; //this does not return properly. 

   }
}

到目前为止我的调试

我确认$rebuilder = new TeraWurfl();启动的对象是一个正确的对象。

我可以缩小到这一点,如果删除了$rebuilder = new TeraWurfl();中的TeraWurflDatabase_MySQL5_Mine行,则返回正常。

此外,如果我在文件包含部分中调用现有连接器类TeraWurflDatabase_MySQL5(我包括TeraWurflDatabase_MySQL5.php而不是TeraWurflDatabase_MySQL5_Mine.php)的相同功能,则不存在此问题,并使{{ 1}}) -

public static $DB_CONNECTOR = "MySQL5";

我还比较了 $wurflDbPdoObj = new TeraWurflDatabase_MySQL5(); $wurflDbPdoObj->connect(); $dbObj = $wurflDbPdoObj; echo "before call"; var_dump($dbObj->rebuildCacheTable()); echo "after call"; //works 在这两种情况下创建的对象的var_dump()值(新$rebuilder = new TeraWurfl();和现有TeraWurflDatabase_MySQL5_mine.php)。发现没有问题。

我不知道我的代码有什么问题。有什么想法??

更新
进一步发现问题出在TeraWurflDatabase_MySQL5.php类的构造函数中。构造函数再次启动数据库连接器类的对象 -

TeraWurfl.php

与现有的数据库连接器案例相比,没有出现任何错误/警告,public function __construct() { ... $dbconnector = 'TeraWurflDatabase_'.TeraWurflConfig::$DB_CONNECTOR; //return fails if this object is initiated if($this->db === false) $this->db = new $dbconnector; ... } 看起来很好。还启动了该数据库连接器类的对象。

更新#2 - 分析输出
我按照http://kpayne.me/2012/02/04/use-register_tick_function-to-profile-your-code/中提到的步骤设置代码分析,稍加修改,以便在输出中显示类名,这里是输出 -

var_dump() -

的测试脚本进行概要分析
TeraWurflDatabase_MySQL5_Mine

但是对于现有的类Array ( [TeraWurfl ->__construct] => Array ( [time] => 9.0599060058594E-5 [calls] => 8 ) [TeraWurflDatabase_MySQL5_Mine ->__construct] => Array ( [time] => 4.3630599975586E-5 [calls] => 4 ) [TeraWurflDatabase_MySQL5_Mine ->connect] => Array ( [time] => 0.00010228157043457 [calls] => 6 ) [TeraWurflDatabase_MySQL5_Mine ->rebuildCacheTable] => Array ( [time] => 7.8678131103516E-6 [calls] => 1 ) [show_profile] => Array ( [time] => 1.7881393432617E-5 [calls] => 1 ) ) ,我没有得到函数调用细节,这又很奇怪了 -

TeraWurflDatabase_MySQL5

1 个答案:

答案 0 :(得分:1)

在这种情况下,您可以使用以下方法调试流程,即使没有xdebug

declare(ticks=1);
register_tick_function(function(){
    $debug = debug_backtrace();
    echo "Running on line " . $debug[0]['line'] . " in file " . $debug[0]['file'] . "\n"; 
});

修改 实际上,我的例子很糟糕,所以我只留下了重要部分。