1. ホーム
  2. php

[解決済み] 致命的なエラーです。非オブジェクトでのメンバ関数の呼び出し。

2022-02-09 23:10:46

質問

を持っています。 GCM クラスは send_notification 関数を含んでいます。別のクラスで 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 がヌルだから、何も呼び出さないのです。そこで

$gcm = new GCM();

私の関数内では正しく動作しました。しかし、これを行う他の方法はないのでしょうか?というのは、この関数の中に $gcm のコンストラクタで 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);
        }
    }
}

解決方法は?

もし $gcm = new GCM(); をDemandクラスのコンストラクタで使用する場合、変数 $gcm はコンストラクタのメソッドでのみ使用可能です。

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

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);
        ...
    }
    ...
}