2010-08-25 94 views
1

簡單實例如何實現不起作用?我一直在對所有我創建/實例化的類做同樣的方法,但這是唯一給我這種錯誤的方法。另一個「又一次調用成員函數function()在非對象上」

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

打印出的確切錯誤是什麼?包括實際的方法名稱和行。 – BoltClock 2010-08-25 17:50:45

回答

4

我認爲你正試圖從對象範圍內進入全球$myRegExp

你應該構造probaby添加到您的驗證:

public function __construct($re) 
{ 
    $this->myRegExp = $re; 
} 

然後實例您的驗證這樣的: $validator = new Validate($myRegExp);

而且你應該在你的驗證類中聲明成員變量「myRegExp」。


並在旁註:我認爲你應該重新考慮你的設計。如果我是你,我會創建一個接口:

interface IValidator 
{ 
    public function valid($input); 
} 

讓您的具體的正則表達式的類實現該接口:

class ValidateFnameAndLname implements IValidator 
{ 
    function valid($flname) 
    { 
     return preg_match("/[a-zA-Z' ']{2,}/", $flname); 
    } 
} 

,構建你的驗證類是這樣的:

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

然後你正在努力獲得更加連貫的設計。

+0

+1:肯定看起來它試圖訪問不可見的東西。哎呦。 – Powerlord 2010-08-25 17:53:24

1

我猜這是給你一個問題的線?您可以使用$this->myRegExp,但那不是Validate類的成員。您已將$ myRegExp聲明爲全局變量。

相關問題