对于这个可怕的问题标题感到抱歉,我不确定如何更好地表达它。
我已经加载了一个类,可以使用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}\n
,var_dump(is_object($date_rule))
输出bool(true)
。
所以最终我只是将加载和实例化包装在一个单独的类中,该类在内部保存规则并通过getter提供它们。所以我想有一些我不理解的范围问题。
答案 0 :(得分:0)
不应该是你的最后一行
$rec_valid = $date_rule->test(array('required'=>false), '10-2-2013');
因为您已将新对象分配给var $ date_rule
$date_rule = new $class;
不是$ dateRule
...
答案 1 :(得分:0)
原来应该加载的文件有一个案例问题,这个问题只在区分大小写的文件系统上显而易见,我的开发框不是。