2009-07-16 12 views
10

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

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

self :: depreciatedはこのスタイルを使用する際の注意点ですか?

私は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; 
    } 

} 

この例

はに設定されたエラー報告とKohanaの中で動作します。 のerror_reporting(E_ALL &〜E_STRICT);

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

静的な方法でself :: categories()を呼び出しているので$ thisは利用可能ではありませんが、categories()をstaticとして定義してエラーをスローするときのみです。

しかし私は、読みやすさの観点から、この機能がどこにあるのかを正確に知っているので、自己を使う方がむしろ好きです。$ thisを使用するよりもむしろあいまいです。

+1

のためにあなたが静的にコールカテゴリメソッドで$にオブジェクトのこのインスタンスを参照することはありませんので、このコードが動作する理由があります。 – null

答えて

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'; 
    } 
} 

を書く簡単な方法です。静的関数はオブジェクトごとではなく、クラスあたりです。::がクラスの静的インスタンスを参照すると間違っていると言うと、それは静的メソッドにアクセスする単なる方法です - これらのメソッドを持つオブジェクトインスタンスはありません。

ので:

我々はまた、それができたとして、我々は(完全なクラス名を入力する必要がないように、我々はself::parent::を使用することができ、クラスの犬内部

Animal::$arms 

を使用することができます

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

非常に長いです!)

あなたの質問に答えて:いいえ - self::は廃止されておらず、使用するのは悪い習慣でもありません。それがkohanaコアで使われていない理由は、非常に異なる理由です....(透明なクラスの拡張子はevalで、詳細は以下を参照してください...)。非静的メソッドを呼び出す

p.sは静的間違っであり、あなたがerror_reporting(E_ALL | E_STRICT)設定している場合(あなたが開発中になければならないように)あなたは、エラーが発生しているが表示されますallowed-すべきではありません。

基本的に何をされて起こる:

class Controller_Core { 
    public function someMethod(){} 
} 

あなたが作成します:あなたはMY_Controllerを作成しているない限り

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

これは本当にController_Coreを延長している

コアと呼ばれるファイルを持っています.phpはになります210。

//MY_Controller.php 
class Controller extends Controller_Core 
{ 
     // overloads Controller_Core::someMethod without us having to change the core file 
     public function someMethod(){} 
} 
+0

これを説明する時間をいただき、ありがとうございます。非常に役に立ちます。私は今あなたが意味することを理解しています。「静的関数はオブジェクトごとではなくクラスごとです。私はbenlumleyが提供するドキュメントを読むつもりですが、私のコードがまだ動作しているという事実にまだ戸惑っています。私の質問にいくつかのサンプルコードを追加しました。再度、感謝します。 – superjadex12

0

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

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

16

違いがあります。

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

parentおよびselfは、メソッドを静的に呼び出すために使用されます。

This page of PHP's manualは、私が現時点で書く時間よりも詳細に説明しています。特に最初の例は、いくつかの違いを強調するのに役立ちます。最初の例をコピーして貼り付けることをお勧めします。その違いが分かっていないのであれば、あなたの心の中に入る重要な概念だと思います。

+0

返信いただきありがとうございます。ドキュメントのリンクはとても役に立ちます。私はそれを見つけるための正しい言葉を考え出すことができませんでした。 – superjadex12

+0

親はメソッドを静的に呼び出すためには(唯一)使用されません。 Objectコンテキストから呼び出された場合、オブジェクトコンテキストを持つ親クラスの関数を呼び出します。 –

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を) ;静的に起因するPHPのバグのために動作し、あなたがそれを行うことができるべきではありません)(プライベート関数のカテゴリを呼び出す

を(Kohanaのファイルにそれを変更):)

0

方法で注意すべきもう一つの事はありますこれは、カテゴリのリストを返す静的コントローラ関数を作成するための非常に優れた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); 
0

私は厳密に自己を使用する::のみ静的変数と静的メンバ関数

関連する問題