为什么新的$ class;当class_exists($ class)返回true时返回null?

时间:2013-09-06 21:24:25

标签: php class constructor

对于这个可怕的问题标题感到抱歉,我不确定如何更好地表达它。

我已经加载了一个类,可以使用error_log(json_encode(class_exists($class)));对其进行验证,其中$class是一个包含类名的字符串,在这种情况下为"JFormRuleDate"

但是,当我致电$dateRule = new $class;$dateRule = new $class();时,$dateRule设置为NULL。我可以使用error_log(json_encode($dateRule));验证哪个

该类从其父级继承其构造函数(我可以验证如上所述),我可以在将包含该类的文件移动到公共库之前实例化实例,但我没有更改类,所以我'我不确定为什么它现在表现不同。

该类是自动加载的,但文件和类的情况都是正确的,我已经检查过了。使用var_export(在此上下文中不能使用var_dump)我得到JFormRuleUint::__set_state(array(\n 'regex' => '^[0-9]+$',\n 'modifiers' => NULL,\n))似乎正确,is_object($dateRule)返回false,并尝试使用$dateRule引发Call to a member function test() on a non-object错误。 !$dateRule也会返回true。

没关系is_object返回false,我有条件向后退。

所以我能做的最简单的测试用例是:

jimport('joomla.form.helper');
$dateRule = JFormHelper::loadRuleType('date', true);
$class ="JFormRuleDate";
error_log(var_export(class_exists($class),true));
error_log(var_export($dateRule,true));
$date_rule = new $class;
error_log(var_export($date_rule,true));
if(!is_object($dateRule)){
      error_log('Couldn\'t load date validation rules.');
}//else{//commented for demonstration purposes
      $rec_valid = $date_rule->test(array('required'=>false), '10-2-2013');
//}

该课程定义为:

<?php
defined('JPATH_PLATFORM') or die;

jimport('joomla.form.formrule');

class JFormRuleDate extends JFormRule
{
  protected $regex = '^[0-9]{4}-[0-1][0-9]-[0-3][0-9]$';
  public function test(&$element, $value, $group = null, &$input = null, &$form = null)
  {
    // If the field is empty and not required, the field is valid.
    $required = ($element['required'] === true || (string) $element['required'] === 'required');
    if (!$required && empty($value)) {
      return true;
    }

    // Test the value against the regular expression.
    if (!parent::test($element, $value, $group, $input, $form)) {
      return false;
    }

    // bounds
    $parts = explode('-', $value);
    return checkdate($parts[1] , $parts[2], $parts[0]);
  }
}
?>

我的输出是

[Fri Sep 06 16:06:08 2013] [error] [client ::1] true, referer: https://localhost//portals/admin-portal
[Fri Sep 06 16:06:08 2013] [error] [client ::1] JFormRuleDate::__set_state(array(\n   'regex' => '^[0-9]{4}-[0-1][0-9]-[0-3][0-9]$',\n   'modifiers' => NULL,\n)), referer: https://localhost/portals/admin-portal
[Fri Sep 06 16:06:08 2013] [error] [client ::1] JFormRuleDate::__set_state(array(\n   'regex' => '^[0-9]{4}-[0-1][0-9]-[0-3][0-9]$',\n   'modifiers' => NULL,\n)), referer: https://localhost/portals/admin-portal
[Fri Sep 06 16:06:08 2013] [error] [client ::1] Couldn't load date validation rules., referer: https://localhost/portals/admin-portal
[Fri Sep 06 16:06:08 2013] [error] [client ::1] PHP Fatal error:  Call to a member function test() on a non-object in /var/www/modules/mod_admin_form/helper.php on line 81, referer: https://localhost/portals/admin-portal

设置error_reporting(-1);,除上述内容外,我还会看到:

[Fri Sep 06 16:13:56 2013] [error] [client ::1] PHP Notice:  Undefined variable: date_rule in /var/www/libraries/metabolistics/validation/validation.php on line 18, referer: https://localhost/portals/admin-portal

记住ob_start和朋友,var_dump($date_rule)的输出为object(JFormRuleDate)#1068 (2) {\n ["regex":protected]=>\n string(32) "^[0-9]{4}-[0-1][0-9]-[0-3][0-9]$"\n ["modifiers":protected]=>\n NULL\n}\nvar_dump(is_object($date_rule))输出bool(true)

所以最终我只是将加载和实例化包装在一个单独的类中,该类在内部保存规则并通过getter提供它们。所以我想有一些我不理解的范围问题。

2 个答案:

答案 0 :(得分:0)

不应该是你的最后一行

$rec_valid = $date_rule->test(array('required'=>false), '10-2-2013');

因为您已将新对象分配给var $ date_rule

$date_rule = new $class;

不是$ dateRule

...

答案 1 :(得分:0)

原来应该加载的文件有一个案例问题,这个问题只在区分大小写的文件系统上显而易见,我的开发框不是。