-1

でメソッドを直接呼び出すことができると思いましclassname::methodたが、機能しませんでした。これはどのように可能ですか?xdebugを使用して関数呼び出しをトレースしましたが、エラーが発生します。メソッドがクラス変数を必要とする場合、それは問題になりますか?

これは機能します:

    $a = new export_csv();
    $a->dl_csv();

これはしません:export_csv::dl_csv();

メソッドにpublicstaticを追加しましたが無駄になりました。ログファイルに何も表示されず、xdebugはエラーメッセージなしで動作を停止しますか?これは正常ですか?私のクラスにはいくつかのクラスが含まれていて、データベースに接続し、いくつかの行をプルしてエコーしますか?

 require_once(PATH_t3lib.'class.t3lib_db.php');
 require_once(PATH_t3lib.'class.t3lib_div.php');
 require_once(PATH_t3lib.'utility/class.t3lib_utility_math.php');

 class export_csv 
 {
     var $filename = 'meinname.csv';

     public static function dl_csv()
     {
        // bitte nicht ändern muß zur laufzeit geladen werden
        include(PATH_typo3conf.'localconf.php');

        $GLOBALS['TYPO3_DB'] = t3lib_div::makeInstance('t3lib_DB');
        $GLOBALS['TYPO3_DB']->connectDB($typo_db_host, $typo_db_username,   
            $typo_db_password, $typo_db);

        session_start();
            $targetCat = mysql_real_escape_string($_SESSION['targetCat']);

            // calculate the number of rows for the query. We need this for paging the 
            result
            $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery(  'V.title VT, V.uid VU,  
            S.title ST, S.uid SU, S1.uid S1U, S1.title S1T',
                                                    'tx_category V
                                                    INNER JOIN tx_category S ON  

                                                    V.parent_category=S.uid
                                                    INNER JOIN tx_category S1 ON 
                                                    S.parent_category=S1.uid',
                                                    'V.uid='.$targetCat.' OR S.uid='.
                                                     $targetCat.' OR S1.uid='.
                                                     $targetCat.
                                                    ' AND V.deleted=0 AND V.hidden=0',
                                                    '',
                                                    '',
                                                    ''
                            );                      
    $arrcount=0;
    while ( $row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res) )
    {
        $categories[] = mysql_real_escape_string($row["VU"]);
        ++$arrcount;
    }

    header("Pragma: public");
    header("Expires: 0");
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("Cache-Control: public");
    header("Content-Description: File Transfer");
    header("Content-Type:text/comma-separated-values");
    header("Content-Transfer-Encoding: binary");
    header("Content-Disposition: attachment; filename=$this->filename");

    if ( $arrcount )
    {
        $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('*',
                                                      'tx_download',
                                                      'category IN('.implode(",",
                                                      $categories).")",
                                                      '',
                                                      "",
     ""                                                  
                                                    );
        while ($row = mysql_fetch_assoc($res) )
        {
            $s = array ();
            $s[] = $row['1'];
            $s[] = $row['2'];
            $s[] = $row['3'];
            $s[] = $row['4'];
            $s[] = $row['5'];

            echo '"'. substr ( implode ( '","', $s ),0,strlen ( implode ( '","', $s) ) - 2  ) . "\r\n";

        }       
    }
  }
 }
4

2 に答える 2

2

として定義されたメソッドstaticは、インスタンスのプロパティ/メソッドを使用できません(via $this)。静的に呼び出すことができます。

ClassName::methodname();

// Static method definition:
public static function methodname() {
  echo "I'm the method, I don't use \$this in any way!";
  // Any attempt to use $this in here would result in error.
}

メソッドとプロパティに関するPHPドキュメントを確認するstatic

モードコードを見た後に更新します:

関数は出力ヘッダーにdl_csv()アクセス$this->filenameしますが、これは静的呼び出し内では無効です。

// Can't do this!
header("Content-Disposition: attachment; filename=$this->filename");

$filename代わりに、静的プロパティとしても定義し、 self:::を介して呼び出す必要があります。

// Top of the class:
// Instead of the old PHP4 var keyword, define $filename as a public static property
public static $filename = 'meinname.csv';

// Later...
// Inside your method header() call:
header("Content-Disposition: attachment; filename=" . self::$filename);
于 2012-07-27T13:56:09.063 に答える
0

ただし、アプリケーション全体( ly)Class::method();全体でアクセスできるようにする必要があると考える理由については非常に興味があります。global

代わりに、依存性注入に興味があるかもしれません。

于 2012-07-27T13:57:37.183 に答える