10

PHPクラスで作業するときにself::method()とparent :: method()を使用することが許容される/推奨されるかどうかを知りたいです。

$ this-> method()を使用できますが、$ this->は、クラス変数、親クラス変数、または親クラスのメソッドを参照することもできます。自己に曖昧さはありません::

自己::は減価償却されていますか、および/またはこのスタイルを使用する際の警告または短所はありますか?

self::とparent::はクラスの静的インスタンスを参照していることを理解していますが、kohanaでは、メソッドを静的として明確に定義しない限り、違いはないようです。

ありがとう。

例を追加しました:このアプリケーションが複数のWebサイトからのフォーラムを保存すると仮定します...

class Forum_Controller extends Controller {

    function __construct()
    {
        parent::__construct();
    }

    function index()
    {
        echo self::categories();
    }

/*
 * get a list of categories from a specific site.
 */
    private function categories()
    {
        $db = new Database;
        $categories = $db->query("
            SELECT * FROM
            forum_categories
            WHERE fk_site = '$this->site_id'
        ");
        $view = new View('categories_view');
        $view->categories = $categories;
        return $view;
    }

}

この例は、エラー報告を次のように設定してコハナで機能します。error_reporting(E_ALL&〜E_STRICT);

$ this-> site_idは、メインのController_Coreクラス(kohanaのライブラリ)で定義されています。

私の知る限り、静的な方法でself :: category()を呼び出しているため、$ thisは使用できないはずですが、categories()を静的として定義した場合にのみエラーがスローされます。

しかし、私が言ったように、私は自分自身を使用する方がはるかに好きです::読みやすさの観点から、あいまいさを引き起こす$ thisを使用するのではなく、この関数がどこにあるべきかを正確に知っています。

4

6 に答える 6

16

違いがあります。

$thisオブジェクトのインスタンスを指します。

parentself静的にメソッドを呼び出すために使用されます。

PHPのマニュアルのこのページでは、現時点で書く時間よりも詳細に説明しています。特に最初の例は、いくつかの違いを強調するのに役立つはずです。最初の例をコピーして貼り付けて、それをいじってみることをお勧めします。違いがわからない場合は、頭に入れておくことが重要な概念だと思います。

于 2009-07-16T08:35:59.747 に答える
6

コントローラーは、静的メンバー変数/メソッドまたは定数を含めることができますが、Kohanaでは静的ではありません。

self::簡単な書き方ですClassName::

class Animal
{
    public static $arms = 0;
}

class Dog extends Animal
{
    public static $leg = 0;
    const NAME = 'dog';

    public static function bark()
    {
        echo 'Woof';
    }
}

静的関数を呼び出したり、クラスから定数を取得したりするには、スコープ解決演算子を使用します::。静的関数は、オブジェクトごとではなく、クラスごとにあります。クラスの静的インスタンスを参照していると::言うのは間違っています。これは静的メソッドにアクセスするための単なる方法です。これらのメソッドを持つオブジェクトインスタンスはありません。

それで:

Dog::bark(),
Dog::$leg, 
Dog::NAME, 

使用することもできます

Animal::$arms

クラスDog内で使用できるためself::parent::完全なクラス名を入力する必要はありません(非常に長くなる可能性があるため)。

しかし、あなたの質問に答えて:いいえ-self::は非推奨ではなく、それを使用することは悪い習慣ではありません。これがkohanaコアで使用されない理由は、まったく異なる理由です....(eval詳細については以下を参照してください...)。

非静的メソッドを静的に呼び出すpsは間違っているため、許可しないでください。設定するとerror_reporting(E_ALL | E_STRICT)(開発中のように)、エラーが発生します。

基本的に何が起こるかです:

Coreには次のファイルがあります。

class Controller_Core { 
    public function someMethod(){}
}

作成します:

// We can use someMethod of Controller_Core
Index_Controller extends Controller {}

Controller_Core MY_Controller.phpを作成していない限り、これは実際に拡張されていますclass Controller extends Controller_Core

//MY_Controller.php
class Controller extends Controller_Core
{
      // overloads Controller_Core::someMethod without us having to change the core file
      public function someMethod(){}
}
于 2009-07-16T10:11:43.923 に答える
0

self::は一般的に静的関数とプロパティに使用されると思います。

私はコハナを使用していますが、おそらくコントローラーは静的になっています。

于 2009-07-16T08:34:37.677 に答える
0

コメントを追加できませんでした(必要な担当者がいないようです!)

class Forum_Controller extends Controller {

public function __construct()
{
    parent::__construct();
}

public function index()
{
    echo self::categories();
}

/*
 * get a list of categories from a specific site.
 */
private static function categories()
{
    $db = new Database;

    // You cannot use $this in a static function, because static functions are per class 
    // and not per object it doesnt know what $this is :)   (make private static $site_id and use self::$site_id) if this is what you want

    $categories = $db->query("
            SELECT * FROM
            forum_categories
            WHERE fk_site = '$this->site_id'
    ");
    $view = new View('categories_view');
    $view->categories = $categories;
    return $view;
}

}

私が言ったように、error_reporting(E_ALL | E_STRICT);を使用する必要があります。(kohanaファイルで変更してください)

プライベート関数categories()の呼び出しは、PHPのバグのために静的に機能しますが、実行できないはずです:)

于 2009-07-16T13:02:20.403 に答える
0

ちなみに、もう1つ注意すべき点は、これは、カテゴリのリストを返す静的コントローラー関数を作成するのにあまり適したMVC設計ではないということです。

コントローラはリクエストを処理するためのものであり、モデルはデータ(これが何であるか)を処理するためのものであり、ビューは表示のためのものです。

モデルを作ろう!

class Category_Model extends Model
{
      public function categories($site_id)
      {
            $categories = $this->db->from('forum_categories')->where('fk_site',$site_id)->get();

                return new View('categories_view', array('categories' => $categories)); 
      }
}

..。

$cat = new Category_Model;

echo $cat->categories(1);
于 2009-07-16T13:31:44.330 に答える
0

私は厳密にself::を静的変数と静的メンバー関数にのみ使用します

于 2009-07-16T13:53:58.560 に答える