2016-04-12 12 views
0

私は口座番号を確認する方法を検討中です。 $ account_numberは、検証のために別の関数から渡されます。関数からクラスに渡って変数にスコープの問題がありました。私はそれを働かせましたが、スコープの問題を回避するために$ GLOBALSを使用しました。私は良い方法がなければならないように感じる。ここでは、私が持っているものである:(非常に悪い習慣とみなされる)$ _GLOBALSあなたのコードをリファクタリングに必要を使用して周りを取得するためにSOAP拡張クラスのPHP可変スコープの問題

$acct; 
$subAcct; 
$chart; 
$object; 
$subObject; 
$project; 

function verifyACCT($account_number){ 
    //Strip all but numbers and letters, truncate to first seven digits, and convert to uppercase 
    $account_number = strtoupper(preg_replace("/[^a-z0-9]/i", "", $account_number)); 
    $GLOBALS['$acct'] = substr($account_number, 0, 7); 
    $GLOBALS['$subAcct'] = substr($account_number, 8); 
    $GLOBALS['$chart'] = "XX"; 
    $GLOBALS['$object'] = "0000"; 
    $GLOBALS['$subObject'] = null; 
    $GLOBALS['$project'] = null; 

    class ACCTSoapClient extends SoapClient { 

     public function __doRequest($request, $location, $action, $version, $one_way=0) { 

      $request = '<?xml version="1.0" encoding="utf-8"?> 
      <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
      <soap:Body> 
      <isValidAccountString xmlns="http://URL/"> 
      <chartOfAccountsCode xmlns="">'.$GLOBALS['$chart'].'</chartOfAccountsCode> 
      <accountNumber xmlns="">'.$GLOBALS['$acct'].'</accountNumber> 
      <subAccountNumber xmlns="">'.$GLOBALS['$subAcct'].'</subAccountNumber> 
      <objectCode xmlns="">'.$GLOBALS['$object'].'</objectCode> 
      <subObjectCode xmlns="">'.$GLOBALS['$subObject'].'</subObjectCode> 
      <projectCode xmlns="">'.$GLOBALS['$project'].'</projectCode> 
      </isValidAccountString> 
      </soap:Body> 
      </soap:Envelope>'; 

      return parent::__doRequest($request, $location, $action, $version, $one_way); 
     } 
    } 

    $client = new ACCTSoapClient("https://URL?wsdl", array("connection_timeout"=>5, 'exceptions' => 0)); 

    try { 
     $result = $client->isValidAccountString(null); 
     return ($result->return); //boolean (1 for valid, null for invalid) 
    } catch(SoapFault $e) { 
     echo 1; 
    } catch(Exception $e) { 
     echo 1; 
    } 
} 

答えて

1

現在、オブジェクト指向プログラミングによる手続き型コードアプローチが混在しています。

  1. ACCTSoapClientクラスを分けて、新しいクラスを作成して検証してください。
  2. 依存関係注入を使用して、検証クラスのSoapClientクラスを設定します。単純化のため、コンストラクタでインスタンス化するだけです。
  3. 現在のグローバル変数を新しい検証クラスの中に、アクセス修飾子protectedまたはprivateで置きます。
  4. 今私はverify方法は

をごSOAPクラスのdoRequestメソッドを呼び出し、応答を返します検証クラスをインスタンス化し、verify方法

  • を呼び出す検証クラス内のpublic functionverify
  • を作成します。これがあなたを正しい軌道に導くのを助けてくれることを願っています。

  • 関連する問題