0

私はphp OOPに慣れていないので、今困っています。私は構造化プログラミング (OOP ではない) でプロジェクトを開発しており、クラス (他の人が作成したもの) を含めており、構造化関数内でクラスを初期化して処理を行う必要があります。ここに入力した内容が理解できない場合は、コードを見てください。

<?php
require __DIR__ . '/SourceQuery/SourceQuery.class.php';

function get_server_info($ip, $port){

    define( 'SQ_SERVER_ADDR', $ip );
    define( 'SQ_SERVER_PORT', $port );
    define( 'SQ_TIMEOUT',     5 );
    define( 'SQ_ENGINE',      SourceQuery :: GOLDSOURCE );

    $Query = new SourceQuery( );

    try
    {
        $Query->Connect( SQ_SERVER_ADDR, SQ_SERVER_PORT, SQ_TIMEOUT, SQ_ENGINE );

        $result = (array)$Query->GetInfo();

    }
    catch( Exception $e )
    {
        $result = array('Players' => 0, 'MaxPlayers' => 0);
    }

    $Query->Disconnect( );
    unset($Query);
    return array('players' => $result['Players'], 'max_players' => $result['MaxPlayers']);
}
?>

基本的に、SourceQuery オブジェクトを構築する get_server_info という関数を作成しました。プレイヤー数と最大プレイヤー数を Counter-Strike サーバーに問い合わせています。

これがプログラム的に正しいかどうかはわかりません(OOPで構造化された混合)。コードを変更したり、クラスでメソッドを作成したりしたくありません。自分の関数を使用したいのです。各呼び出し (get_server_info()) の結果を取得していますが、問題はすべての結果が同じであることです!

例えば:

for($i = 0; $i < 30; $i++){
   $result = get_server_info('66.55.44.3'.$i, 27015);
   echo $result['players'].' - '.$result['max_players'].'<br />';
}

結果はどのサーバーでも同じです。(はい、それらはすべて稼働しています)。サーバービューアープログラムでサーバーをチェックすると、プレーヤーの数が異なりますが、このループの結果は同じです! どうしてか分かりません。

手動で 1 つずつクエリを実行すると、正しい結果が得られます。

オブジェクトが削除されていないためだと思いますか....わかりません。

4

2 に答える 2

1

定数を上書きしようとしているからだと思います。( define)

関数の外側のコード内のどこかに定数を定義し、$idand を$port 直接クラスに渡します。そして、どこで$Query初期化しましたか?

試す:

define( 'SQ_TIMEOUT',     5 );
define( 'SQ_ENGINE',      SourceQuery :: GOLDSOURCE );

function get_server_info($ip, $port){

    try
    {
        $Query->Connect( $ip, $port, SQ_TIMEOUT, SQ_ENGINE );
于 2013-03-20T21:33:54.477 に答える
1

あなたが忘れてしまった

$Query = new SourceQuery( );

ここで例を見てください。

于 2013-03-20T21:35:47.473 に答える