1

初心者の質問です。クラスメソッド内に変数がありますが、$ thisを使用してアクセスできるクラス変数にする必要がありますか?いいえの場合、クラス変数をいつ使用または作成するのか説明してください。

private function is_valid_cookie()
{
    $securedtoken = $this->input->cookie('securedtoken');
    // Checks if the cookie is set
    if (!empty($securedtoken)) {
        // Checks if the cookie is in the database
        $s = $this->db->escape($securedtoken);
        $query = $this->db->query("SELECT cookie_variable FROM jb_login_cookies WHERE cookie_variable=$s");
        if ($query->num_rows() != 0) {
            // Now let us decrypt the cookie variables
            $decoded = unserialize($this->encrypt->decode($securedtoken));
            $this->login($decoded['username'], $decoded['password']);
            return true;
        } else {
            return false;
        }
    } else {
        return false;
    }
}

ご覧のとおり、変数$securedtokenと$decoded = array()があります。これらをクラス変数にして、$thisでアクセスする必要があるかどうかを判断できません。

4

4 に答える 4

1

はい、そうです。次のようにクラス変数を宣言できます。

class Dog
{
    protected $name = 'Spot';

    public function getName()
    {
        return $this->name;
    }
}

プロパティ(メンバー変数)の詳細については、ドキュメントを参照してください。

于 2012-08-13T21:43:37.937 に答える
1

私は実際、クラスレベルの変数の使用を最小限に抑えて、複数のメソッド間で共通になる場合や、クラス外のコードから(直接またはゲッター/セッターを介して)参照される場合に使用しています。変数がメソッドのローカルスコープで必要なだけの場合は、それでクラスを汚染しないでください。

于 2012-08-13T21:44:15.367 に答える
1

クラス内のさまざまな関数全体でこれらの変数を共有しようとしている場合は、クラス変数を作成する必要があります。次に、外部コードがそれらを表示できるかどうか、子クラスがそれらを表示できるかどうか、またはまったく表示できないかどうかに応じて、これらのプロパティに異なるアクセス修飾子(パブリック、プライベート、保護)が必要になります。

于 2012-08-13T21:44:26.473 に答える
1

インスタンス変数にする必要はありません。それらを静的変数にすることも、定数変数にすることもできます! クラス変数を使用して、クラスの属性を記述します。つまり、クラスが持っているもの。

用語を正しく理解することも重要です。変数とインスタンス変数の作成について質問しています。クラス変数 (http://en.wikipedia.org/wiki/Class_variable) は静的変数を参照します

特定の例では、2 つの変数がその関数でのみ使用される場合、それらをインスタンス変数にしないでください。クラス全体でそれらを共有する理由はありません。一方、他のメソッドまたははい以外の場所でそれらを再度使用する必要がある場合。あなたがすべき。

必要な変数の種類とアクセスの種類を決定することは、設計上の決定です。

開始するのに適した場所は、オブジェクト指向の php の概要です。http://php.net/manual/en/language.oop5.php

基本的な初心者向けチュートリアル http://www.killerphp.com/tutorials/object-directional-php/

于 2012-08-13T21:48:14.510 に答える