对不起,这个可怕的问题标题,我不确定如何更好地表达它。
我加载了一个类,并且可以使用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,并尝试使用$dateRule
throwsCall 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}\n
和var_dump(is_object($date_rule))
outputs的输出bool(true)
。
所以最终我只是将加载和实例化包装在一个单独的类中,该类在内部保存规则并通过 getter 提供它们。所以我想有一些我不理解的范围问题。