为什么简单的实例化不起作用?我一直在为我创建/实例化的所有类做同样的方法,但这是唯一一个给我这种错误的类。
Fatal error: Call to a member function validate_fname_and_lname() on a non-object in /homepages/......../Validate.php on line 23
这是我的代码:
//Class Validate
<?php
require_once 'RegExp.php';
$myRegExp = new RegExp();
class Validate
{
//Sends each entry to corresponding RegExp function with appropriate regular expression
function validate_form($un, $fname)
{
$err_counter = 0;
if(!$this->myRegExp->validate_fname_and_lname($fname))
{
$error_identifier .= 'firstName+';
++$err_counter;
}
}
}
//Class RegExp
<?php
class RegExp
{
function validate_fname_and_lname($flname)
{
return preg_match("/[a-zA-Z' ']{2,}/", $flname);
}
}
答案 0 :(得分:4)
我认为您正尝试从对象范围内访问全局$myRegExp
。
您应该为验证者添加构造函数:
public function __construct($re)
{
$this->myRegExp = $re;
}
然后像这样实例化你的Validator:
$validator = new Validate($myRegExp);
你应该在Validate类中声明一个成员变量'myRegExp'。
并且旁注:我认为你应该重新考虑你的设计。如果我是你,我会创建一个界面:
interface IValidator
{
public function valid($input);
}
让您的特定正则表达式类实现该接口:
class ValidateFnameAndLname implements IValidator
{
function valid($flname)
{
return preg_match("/[a-zA-Z' ']{2,}/", $flname);
}
}
构建你的Validate类:
class Validate
{
protected $myRegExp;
public function __construct(IValidator $validator)
{
$this->myRegExp = $validator;
}
//Sends each entry to corresponding RegExp function with appropriate regular expression
function validate_form($un, $fname)
{
$err_counter = 0;
if(!$this->myRegExp->valid($fname))
{
$error_identifier .= 'firstName+';
++$err_counter;
}
}
}
然后你就可以获得更加连贯的设计了。
答案 1 :(得分:1)
我猜这是给你一个问题的路线?
if(!$this->myRegExp->validate_fname_and_lname($fname))
您使用$this->myRegExp
,但那不是Validate类的成员。您将$ myRegExp声明为全局变量。