2010-05-13 84 views
0

我在調用類中的特定函數時遇到問題。電話可以撥出:調用類中的函數

case "Mod10":   
     if (!validateCreditCard($fields[$field_name])) 
     $errors[] = $error_message; 
    break; 

和類代碼:

class CreditCardValidationSolution { 

    var $CCVSNumber = ''; 
    var $CCVSNumberLeft = ''; 
    var $CCVSNumberRight = ''; 
    var $CCVSType = ''; 
    var $CCVSError = ''; 

function validateCreditCard($Number) { 

     $this->CCVSNumber  = ''; 
     $this->CCVSNumberLeft = ''; 
     $this->CCVSNumberRight = ''; 
     $this->CCVSType  = ''; 
     $this->CCVSError  = ''; 

     // Catch malformed input. 

     if (empty($Number) || !is_string($Number)) { 
      $this->CCVSError = $CCVSErrNumberString; 
      return FALSE; 
     } 

     // Ensure number doesn't overrun. 
     $Number = substr($Number, 0, 20); 

     // Remove non-numeric characters. 
     $this->CCVSNumber = preg_replace('/[^0-9]/', '', $Number); 

     // Set up variables. 
     $this->CCVSNumberLeft = substr($this->CCVSNumber, 0, 4); 
     $this->CCVSNumberRight = substr($this->CCVSNumber, -4); 
     $NumberLength   = strlen($this->CCVSNumber); 
     $DoChecksum   = 'Y'; 

     // Mod10 checksum process... 
     if ($DoChecksum == 'Y') { 

      $Checksum = 0; 

      // Add even digits in even length strings or odd digits in odd length strings. 
      for ($Location = 1 - ($NumberLength % 2); $Location < $NumberLength; $Location += 2) { 
       $Checksum += substr($this->CCVSNumber, $Location, 1); 
      } 

      // Analyze odd digits in even length strings or even digits in odd length strings. 
      for ($Location = ($NumberLength % 2); $Location < $NumberLength; $Location += 2) { 
       $Digit = substr($this->CCVSNumber, $Location, 1) * 2; 
       if ($Digit < 10) { 
        $Checksum += $Digit; 
       } else { 
        $Checksum += $Digit - 9; 
       } 
      } 

      // Checksums not divisible by 10 are bad. 
      if ($Checksum % 10 != 0) { 
       $this->CCVSError = $CCVSErrChecksum; 
       return FALSE; 
      } 
     } 

     return TRUE; 
} 
} 

當我運行應用程序 - 我得到以下信息:

Fatal error: Call to undefined function validateCreditCard() in C:\xampp\htdocs\validation.php on line 339

什麼想法?

回答

0

包含您在其中使用Switch-Case的函數的類是否繼承CreditCardValidationSolution類....?

我的猜測是,你正在試圖調用類外的函數沒有繼承它....也許你只是錯過了....

編輯點評閱讀後: 你需要什麼這裏是 「繼承」

看看下面的鏈接.....

http://www.killerphp.com/tutorials/object-oriented-php/php-objects-page-4.php

http://marakana.com/blog/examples/php-inheritance.html

希望這會有所幫助....

+0

我沒有在課堂上使用開關盒。我在以下內容: Function1()試圖調用Function2()和Function2()生活在ClassA,但功能1不 我還沒有繼承它 - 我對此非常新,老實說,我不甚至知道這意味着什麼,但我認爲你是對的。我試圖從外部調用一個駐留在類內部的函數 – JM4 2010-05-13 04:11:06

2
class Foo { 

    // How may I be called? 
    function bar() { 
    } 

    function baz() { 
     // Use $this-> to call methods within the same instance 
     $this->bar(); 
    } 

    function eek() { 
     // Use self:: to call a function within the same class statically 
     self::bar(); 
    } 

} 

// Use [class]:: to call a class function statically 
Foo::bar(); 

// Use [object]-> to call methods of objects 
$fooInstance = new Foo(); 
$fooInstance->bar(); 

調用方法statically或作爲一個實例方法不一定是可互換的,當心。順便提一下,這在basics of OOP中都很好。

+0

我在別處看到了這個例子,但不知道它適用於我在做什麼。也許它確實存在,我誤解了,但我基本上試圖調用一個函數並讓它通過驗證。不幸的是,我發現的函數放在一個類的內部(並且帶有$這個變量),所以我不斷遇到問題。 我有另一個CASE和FUNCTION工作在完全相同的方法,除了沒有類和$ this這個變量 – JM4 2010-05-13 04:03:37

+0

@ JM4如果函數是一個類的一部分,你需要把它稱爲'[class]: :'或'[object] - >',這些函數不是*全局名稱空間的一部分。是靜態調用函數('::')還是作爲對象的實例方法(' - >')取決於函數的設計。由於它使用'$ this',所以*需要*作爲實例方法調用(' - >')。所以你必須創建一個新類的實例(使用'new')。可能有附加的字符串來實例化類,應該記錄下來,否則你必須仔細閱讀代碼。 – deceze 2010-05-13 04:24:45

+0

@ JM4更具體的代碼:'$ ccVal = new CreditCardValidationSolution(); $ ccVal-> validateCreditCard();' – deceze 2010-05-13 04:26:32