0

私はOOPの用語に不慣れで、ヒットカウンターを作成するクラスを作成しようとしています。

以下のコードを試してみましたが、内部値が1のcounter.txtページのみが作成されます。なぜインクリメントされないのかわかりません。

class LOGFILE {
    public function READ($FileName) {
        $handle = fopen($FileName, 'r');
        $fread = file_get_contents($FileName);
        return $fread;
        fclose($handle);
    }
    public function WRITE($FileName, $FileData) {
        $handle = fopen($FileName, 'w');
        $FileData = $fread +1;
        fwrite($handle, $FileData);
        fclose($handle);
    }
}
$logfile = new LOGFILE();

$logfile -> WRITE("counter.txt",$FileData);

echo $logfile -> READ("counter.txt");
4

5 に答える 5

1

修正されたコードを調べて、何が欠けているかを見てみましょう。

<?php

class LOGFILE {

    public function READ($FileName) {
        $handle = fopen($FileName, 'r');
        $fread = fgets($handle, 8192);
        fclose($handle);
        return $fread;        
    }

    public function WRITE($FileName, $FileData) {        
        $counter = $this->READ($FileName);        
        $handle = fopen($FileName, 'w');        
        fwrite($handle, $FileData + $counter);
        fclose($handle);
    }
}
$logfile = new LOGFILE();
$FileData = 1;
$logfile -> WRITE("counter.txt",$FileData);
echo $logfile -> READ("counter.txt")."\n";
$logfile -> WRITE("counter.txt",$FileData);
echo $logfile -> READ("counter.txt")."\n";

?>
  1. fgetsREAD の代わりに を使用file_get_contents(使用することを選択できます file_get_contentsが、私は を使用する他の関数と一貫性を保ちますfopen)
  2. 関数 WRITE 内での READ の使用 (コード再利用の原則)
  3. WRITE での書き込み権限によるファイルのオープン:'w'
  4. 初期化$FileData = 1;
  5. プライベートメンバーを保持する必要はありません:$fread
  6. 最も重要なこと: return(READ で行ったように) 後にステートメントを書かないでください - 後に書かれたステートメントはreturn実行されません!

このソリューションは正常にテストされました。

于 2012-12-11T08:05:27.040 に答える
1

その理由は、とメソッド$freadの両方のローカル変数であるためです。クラスのグローバル変数にする必要があります。READWRITEprivate

class LOGFILE {
    private $fread;

    public function READ($FileName) {
        $this->fread = file_get_contents($FileName);
        return $this->fread; 
    }
    public function WRITE($FileName) {
            $this->READ($FileName);
        $handle = fopen($FileName, 'w');
        $FileData = $this->fread +1;
        fwrite($handle, $FileData);
        fclose($handle);
    }
}
$logfile = new LOGFILE();

$logfile -> WRITE("counter.txt");

echo $logfile -> READ("counter.txt");

注:fopen andは不要なfcloseので削除しました。file_get_contents書き込みで使用できますfile_put_contents。使用されていない変数も削除され$FileDataました。必要に応じて、変数のメソッドとクラスを作成することをお勧めします。

また、クラス、変数、メソッドなどに名前を付ける方法のベスト プラクティスも参照してください。これが最高のガイドです、IMO。

于 2012-12-11T07:42:20.380 に答える
0

OOP は、必要な場所で使用する必要があります。シンプルなものが必要なので、OOP は必要ありません。

<?php

function addValue($file='counter.txt', $amount=1) {
    if( false == is_file($file) ) {
        return false;
    }
    $initial = file_get_contents($file);
    return @file_put_contents($initial+$amount);
}

addValue();

?>

ショッピング カートやその他の概念など、複雑なものについて OOP の知識をテストします。

編集// したがって、複雑に見える単純な例が必要な場合は、ここに行きます :)

<?php

class log {

    public $file = '';
    private $amount = 0;

    public function __construct( $file ) {
        $this->file = $file;
        $this->amount = 1;
    }

    public function makeAdd() {
        $initial = file_get_contents($this->file);
        return @file_put_contents($this->file, $initial + $this->amount);
    }

    function __call($f, $args) {
        switch( $f ) {
            case 'add':
                if(isset($args[0]) && !empty($args[0])) {
                    $this->amount = (int)$args[0];
                }
                if( $this->amount == 0 ) {
                    throw new Exception('Not a valid amount.');
                }
                return $this->makeAdd();
            break;
        }
    } 

}

try {

    // create log
    $L = new log('count.txt');

    // this will add 2
    var_dump($L->add(2));

    // this will also add 2
    var_dump($L->add());

    // until you rewrite the amount
    var_dump($L->add(1));

    // final result -> 5

} catch(Exception $e) {
    die($e->getMessage());
}

?>

幸運を!

于 2012-12-11T07:45:38.830 に答える
-3

静的カウンターを作成し、毎回インクリメントすることができます(ファイルを作成する代わりに)

<?php
class CountClass {
    public static $counter = 0;

    function __construct() {
        self::$counter++;
    }
}

new CountClass();
new CountClass();


echo CountClass::$counter;
?>
于 2012-12-11T07:41:35.820 に答える