另一个“对非对象的成员函数函数()的另一个调用”

时间:2010-08-25 17:49:52

标签: php

为什么简单的实例化不起作用?我一直在为我创建/实例化的所有类做同样的方法,但这是唯一一个给我这种错误的类。

 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);
    }
}

2 个答案:

答案 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声明为全局变量。