3

send_notification関数をGCM含むクラスがあります。別のクラスでDemand.php、send_notification関数を使用しようとしています。したがって、次のようにクラスDemand.phpを指すコンストラクターがあります。GCM

 $gcm = new GCM();

この$gcm変数は、次のようなクラス内の関数で使用されます。

$result = $gcm->send_notification($registatoin_ids, $message);

ここでエラーが発生します。

<br />n<b>Fatal error</b>:  Call to a member function send_notification() on a non-object in..

問題を検索したところ、問題$gcmはnullであることがわかりました。そのため、何も呼び出されていません。だから私が置くとき

$gcm = new GCM();

私の関数内では正しく機能しました。しかし、これを行う他の方法はありませんか?つまり、 ?$gcmのコンストラクターにcreateingを入れるだけでは大丈夫ではないということです。Demand.php

これが私が言及している部分です:

function __construct() {
    require_once 'GCM.php';
    require_once 'DB_Connect.php';
    require_once 'DB_Functions.php';
    // connecting to database
    $this->db = new DB_Connect();
    $this->db->connect();
    $gcm = new GCM();
    $df = new DB_Functions();

}

// destructor
function __destruct() {

}


public function getDistance($uuid, $name, $distance, $latstart, $lonstart, $latend, $lonend, $gcm_regId) {
    $user_new = array ("$uuid", "$name", "$distance","$latstart", "$lonstart", "$latend", "$lonend","$gcm_regId");  
    $query = sprintf("SELECT uid, distance,latstart, lonstart, latend, lonend, gcm_regid, name FROM user_demand WHERE latstart='%s' AND lonstart='%s'",
    mysql_real_escape_string($latstart),
    mysql_real_escape_string($lonstart));
    $user = mysql_query($query);

    $no_of_rows = mysql_num_rows($user);

    while($user_old = mysql_fetch_assoc($user))
    {
        $djson = $this->findDistance($latend,$lonend,$user_old["latend"],$user_old["lonend"] );

        if ($user_old["distance"]+$distance>=$djson) {
            $match = mysql_query("INSERT INTO matched_users(gcm_a, gcm_b, name_a, name_b) VALUES(".$user_old['gcm_regid'].",".$user_new['gcm_regId'].",".$user_old['name'].",".$user_new['name'].")");
            $registatoin_ids = array($gcm_regId);
            $message = array("var" => $name);
            $result = $gcm->send_notification($registatoin_ids, $message);
        }
    }
}
4

4 に答える 4

9

$gcm = new GCM();Demand クラスのコンストラクターを配置すると、変数$gcmはコンストラクター メソッドでのみ使用可能になります。

Demand クラス全体で変数にアクセスできるようにしたい場合は$gcm、次のようにクラスのプロパティとして設定する必要があります。

class Demand()
{
    /**
     * Declare the variable as a property of the class here
     */
    public $gcm;

    ...
    function __construct()
    {
        ...
        $this->gcm = new GCM();
        ...
    }

    function myFunction()
    {
        ...
        // You can access the GCM class now in any other method in Demand class like so:
        $result = $this->gcm->send_notification($registatoin_ids, $message);
        ...
    }
    ...
}
于 2013-01-09T17:03:59.677 に答える
3

gcm は、インスタンス変数として初期化しない限り、コンストラクターのスコープでのみ使用できます。

class Demand
{
    private $_gcm; 
    function __construct() 
    {
        $this->_gcm = new GCM(); 
    }

    function youWantToUseGcmIn()
    {
        $this->_gcm->send_notification(.....); // access it like this 
    }
}
于 2013-01-09T17:03:05.650 に答える
0

オブジェクト コンストラクターで $gcm を作成し、それを同じクラスの他のメソッドから使​​用しますか? それでは、適切に保管していません。あなたがしなければなりません:

class X {
    function constructor() {
        $this->gcm = new GCM();
    }

    function other_method() {
        $this->gcm->send_notification(...);
    }
}

あなたが持っている場合

function constructor() {
    $gcm = new GCM();  <-- this is just a temporary local variable.
}

コンストラクター内でローカル変数を作成するだけで、コンストラクターが戻るとすぐに破棄されます。新しいオブジェクトを $this->gcm に保存すると、それを含むオブジェクト内に保存され、他のメソッドで使用できるようになります。

于 2013-01-09T17:05:40.353 に答える
0

これは$gcm、オブジェクトではないことを意味します。おそらく、アクセスできないため、場合によっては (何も見つからない) NULL または false です。範囲外

于 2013-01-09T17:06:20.680 に答える