0

对不起,这个可怕的问题标题,我不确定如何更好地表达它。

我加载了一个类,并且可以使用error_log(json_encode(class_exists($class)));where$class是一个包含类名的字符串来验证这一点,"JFormRuleDate"在这种情况下。

但是,当我调用$dateRule = new $class;or$dateRule = new $class();然后$dateRule设置为NULL. 我可以用它来验证error_log(json_encode($dateRule));

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

该类是自动加载的,但文件和类的情况都是正确的,我已经检查过了。使用 var_export (can't var_dump in this context) 我得到JFormRuleUint::__set_state(array(\n 'regex' => '^[0-9]+$',\n 'modifiers' => NULL,\n))了似乎正确的结果,并is_object($dateRule)返回 false,并尝试使用$dateRulethrowsCall 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);set,除了上面我还看到:

[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)isobject(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))outputs的输出bool(true)

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

4

2 回答 2

0

你的最后一行不应该是

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

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

$date_rule = new $class;

不是 $dateRule

??

于 2013-09-06T23:47:55.637 回答
0

原来应该加载的文件有一个大小写问题,这仅在区分大小写的文件系统上很明显,而我的开发盒没有。

于 2014-03-26T15:52:17.480 回答